home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Leser 15 / Amiga Plus Leser CD 15.iso / Tools / Development / mmu / MuManual / Autodocs / mmu.doc < prev    next >
Text File  |  2002-03-12  |  132KB  |  3,838 lines

  1. TABLE OF CONTENTS
  2.  
  3. mmu.library/--Background--
  4. mmu.library/--Patches--
  5. mmu.library/ActivateException
  6. mmu.library/AddContextHook
  7. mmu.library/AddMessageHook
  8. mmu.library/AllocAligned
  9. mmu.library/AllocLineVec
  10. mmu.library/AttemptLockContextList
  11. mmu.library/AttemptLockMMUContext
  12. mmu.library/BuildIndirect
  13. mmu.library/CopyContextRegion
  14. mmu.library/CopyMapping
  15. mmu.library/CreateMMUContext
  16. mmu.library/CurrentContext
  17. mmu.library/DeactivateException
  18. mmu.library/DefaultContext
  19. mmu.library/DeleteMMUContext
  20. mmu.library/DMAInitiate
  21. mmu.library/DMATerminate
  22. mmu.library/DupMapping
  23. mmu.library/EnterMMUContext
  24. mmu.library/GetIndirect
  25. mmu.library/GetMapping
  26. mmu.library/GetMappingProperties
  27. mmu.library/GetMMUContextData
  28. mmu.library/GetMMUType
  29. mmu.library/GetPageProperties
  30. mmu.library/GetPageSize
  31. mmu.library/GetPageUsedModified
  32. mmu.library/GetProperties
  33. mmu.library/LeaveMMUContext
  34. mmu.library/LockContextList
  35. mmu.library/LockMMUContext
  36. mmu.library/NewMapping
  37. mmu.library/PhysicalLocation
  38. mmu.library/PhysicalPageLocation
  39. mmu.library/RebuildTree
  40. mmu.library/RebuildTrees
  41. mmu.library/ReleaseMapping
  42. mmu.library/RemapSize
  43. mmu.library/RemContextHook
  44. mmu.library/RemMessageHook
  45. mmu.library/RunOldConfig
  46. mmu.library/SetBusError
  47. mmu.library/SetIndirect
  48. mmu.library/SetIndirectArray
  49. mmu.library/SetMappingProperties
  50. mmu.library/SetMMUContextData
  51. mmu.library/SetPageProperties
  52. mmu.library/SetProperties
  53. mmu.library/SetPropertiesMapping
  54. mmu.library/SetPropertyList
  55. mmu.library/SuperContext
  56. mmu.library/UnlockContextList
  57. mmu.library/UnlockMMUContext
  58. mmu.library/WithoutMMU
  59.  
  60. mmu.library/--Background--             mmu.library/--Background--
  61.  
  62.     PURPOSE
  63.     The mmu.library provides functions for MMU related operations
  64.     as write- or read-protecting certain areas of memory for a
  65.     given set of tasks, or marking memory regions as "swapped"
  66.     virtual memory support. It offers an abstraction level on top
  67.     of the actual MMU and a unified interface for MMU purposes.
  68.  
  69.     The MMU lib does NOT implement virtual memory, that's the purpose
  70.     of another library - the memory.library. There's no much reason why
  71.     any application except the memory.library and probably some debugging
  72.     tools should call this library directly. The memory.library functions
  73.     on top of this library should suffer for "all day purposes".
  74.  
  75.     The basic object administrated by this library is the "context". A
  76.     "context" is the software abstraction of a MMU translation tree, it
  77.     keeps the information of the status of memory. The mmu.library 
  78.     provides a "global" context that represents the MMU translation tree
  79.     for all tasks. It is build by the init code of the library either by
  80.     snooping the already existing MMU translation tree or by building an
  81.     own tree by looking at the available memory and expansion devices.
  82.  
  83.     Programs can build own contexts by using the MMU library functions and
  84.     may enter or leave the contexts generated in this way. Several tasks
  85.     may share one context, as they represent, for example, multiple 
  86.     "threads" of one single program. Thus, the notation used here is some-
  87.     how turned around: A "context" in the amiga world is called "process"
  88.     in unix, and a "task" or "process" in the amiga world is called a
  89.     "thread" usually.
  90.  
  91.     Tasks that do not enter an own context explicitly share the common
  92.     global context. Even though it is possible to change the global 
  93.     context, this technique should be used only by debugging tools as the
  94.     enforcer. It could, for example, mark unused areas of the memory as
  95.     well as the first 4K as "invalid".
  96.  
  97.     The MMU library provides two "hooks" for each context, the 
  98.     "bus error hook" and the "segmentation fault" hook. The first hook
  99.     is called if an access to an invalid memory location is detected, or
  100.     a write to a read-only memory area. The second is called if an access
  101.     to a memory page marked as "swapped out" is detected. It's part of
  102.     the service of the MMU library to keep these two access violations
  103.     apart.
  104.  
  105.     The default hooks call simply the exception handler of the running
  106.     task, which generates by default the well known "guru". It's up to
  107.     programs on top of the MMU library to setup useful hooks. An enforcer
  108.     like tool might set "bus error hook" to print some useful information
  109.     about the access violation, the memory.library will set the 
  110.     "segmentation fault" hook to swap in the memory in question.
  111.  
  112.     The hooks are really "low-level" routines and are executed in super-
  113.     visor mode, and therefore very limited in power.
  114.  
  115.     The library provides itself a ready-for-use hook function which
  116.     sends a message to a task to be specified and suspends the task
  117.     that caused the bus error until the message is replied.
  118.  
  119.     MMU trees are managed on two levels, a "software abstraction level"
  120.     which is comfortable and easy to use. Memory "properties" of large
  121.     regions of memory can be redefined quite easely with one single
  122.     call, but rebuilding the MMU table tree from this abstraction layer
  123.     is a lengthly operation and requires quite a lot of CPU power
  124.     not available in critical applications.
  125.     Therefore, a more "hardware based" approach is available which
  126.     modifies the existing MMU table "on the fly" and is therefore
  127.     rather fast. However, memory pages to be handled like this must
  128.     be marked with the MAPP_SINGLE property to tell the library to
  129.     build the MMU table in a special way to allow fast modification
  130.     and to bypass some possible optimizations (e.g. "early page
  131.     terminators" and "invalid descriptors not at page level").
  132.     Modifications on this level are never seen by the abstraction
  133.     level above and should be used only once the MMU tree is complete.
  134.  
  135.     If that is, too, not fast enough, the MMU library allows building
  136.     pages using "indirect descriptors". That is, the page property
  137.     flags are given by a true hardware descriptor you provide. This
  138.     makes code CPU specific, obviously, but has the advantage that
  139.     page properties can be modified by a single long word "poke" in
  140.     your program, and the proper ATC flush. This is almost "hardware
  141.     banging", with some support.
  142.  
  143.     This method has one important drawback, namely that the library
  144.     is no longer able to disable caching for DMA transfer to and from
  145.     this page. Hence, NEVER EVER access an indirect page by DMA.
  146.  
  147. mmu.library/--Patches--                mmu.library/--Patches--
  148.  
  149.     To perform its job, the mmu.library has to install a number of 
  150.     system patches. I tried avoid this as best as possible, but some
  151.     installations have to be done.
  152.  
  153.     The following patches are installed:
  154.  
  155.  
  156. exec/CacheControl:      Replaced partially by a function that guarantees
  157.             that the data cache remains off when the mmu.library
  158.             builds descriptors.
  159.  
  160. exec/ColdReboot:    Replaced partially by a function that removes the
  161.             mmu.library installed MMU trees. This is done to
  162.             restart the processor with a clean MMU setup.
  163.  
  164. exec/Alert:        Replaced partially. The Alert() replacement routine
  165.             will check whether the alert caused is fatal or not,
  166.             and will Disable() and unload the mmu.library 
  167.             installed MMU tree if this is the case. Since a
  168.             deadend alert will go over into a reset without
  169.             calling ColdReboot(), this must be done here 
  170.             separately to ensure that the machine restarts
  171.             properly.
  172.  
  173. exec/AddMem:        Adding memory with a MMU setup active would or would
  174.             not mean that the MMU table must be adjusted to
  175.             reflect the changes. This function should not be
  176.             called once the system is setup and running.
  177.  
  178.             V42 and up implementations adds the memory
  179.             to the system and, additionally, modifies the MMU
  180.             tree of the public user and supervisor contexts 
  181.             to make this memory visible and available. Caching
  182.             modes are set accordingly: Imprecise for MEMF_CHIP,
  183.             Copyback for all others.
  184.  
  185.             I'm not quite positive that this is the best way
  186.             how to handle AddMem(), though. This function
  187.             shouldn't be called after bootstrap anyhow.
  188.  
  189. exec/AddConfigDev:      Called to make new hardware known to the system.
  190.             This function shouldn't be called by user code
  191.             after bootstrap anyhow.
  192.  
  193.             The >=V42 implementation modifies the public user
  194.             and supervisor contexts to make the added hardware
  195.             visible, provided it is not memory. In the former
  196.             case, the address range is set to cacheinhibited. In
  197.             the latter, nothing is done as AddMem() should be 
  198.             called instead.
  199.  
  200.             After MMU modifications, either the old expansion
  201.             library function is called, or an internal replace-
  202.             ment routine is made use of if expansion has been
  203.             patched over. This is necessary, unfortunately, since
  204.             some third-party libraries hack here the MMU tree,
  205.             which is undesirable.
  206.  
  207. exec/CachePreDMA:       Replaced completely by a MMU library routine that
  208.             disables copyback mode for non-aligned pages and
  209.             translates the logical address passed in to the
  210.             physical address, by means of the mmu.library 
  211.             public context.
  212.  
  213. exec/CachePostDMA:      Ditto. Replaced completely by the MMU.library.
  214.  
  215.     
  216.  
  217. mmu.library/CreateMMUContext            mmu.library/CreateMMUContext
  218.  
  219.     NAME
  220.     CreateMMUContext - Build a new MMU context.
  221.  
  222.     SYNOPSIS
  223.     context = CreateMMUContextA ( tags );
  224.     d0                   a0
  225.  
  226.     context = CreateMMUContext ( tag1, ... ); 
  227.  
  228.  
  229.     struct MMUContext * CreateMMUContextA ( struct TagItem *);
  230.  
  231.     struct MMUContext * CreateMMUContext ( Tag tag1, ... );
  232.     
  233.     FUNCTION
  234.     This function builds a new MMU context.
  235.  
  236.     INPUTS
  237.     tags    -   Tag items for the context to be created. 
  238.  
  239.     Currently defined tags are:
  240.  
  241.  
  242.     MCXTAG_COPY      -  build a copy of the context * passed in,
  243.                 if the pointer is NULL, build a copy of
  244.                 the global default context. 
  245.  
  246.                 If this tag item is not given, all context
  247.                 addresses will be marked as MAPP_BLANK. Most
  248.                 likely not what you want.
  249.  
  250.                 If you specify a different page size than that
  251.                 of the context you want to clone, you should
  252.                 specify the MCXTAG_ERRORCODE as well and study
  253.                 the return code carefully. The mmu library might
  254.                 have performed some rounding to fit the old
  255.                 table specifications into the new table layout.
  256.                 In worst case, this will make your new table
  257.                 unusable. It is therefore in general not a good
  258.                 idea to specify a page size larger than that of
  259.                 the cloned context. Even though the library 
  260.                 itself allocates all its internal structures
  261.                 aligned to "worst case" page sizes, this might
  262.                 not be true for external user programs.
  263.  
  264.     MCXTAG_SHARE     -  (V43 and up)
  265.                 Share parts of the context * passed in, or the
  266.                 global user context if this pointer is NULL.
  267.                 (RECOMMENDED!)
  268.  
  269.                 The difference between this tag and the previous
  270.                 is that changes of the shared = "parent" context
  271.                 are handed thru to this "child" context 
  272.                 automatically, whereas a context created by
  273.                 MCXTAG_COPY detaches from its parent.
  274.  
  275.                 MCXTAG_SHARE implies several restrictions, though.
  276.                 Sharing contexts *must* use the same table layout
  277.                 as the parent context, especially must use the
  278.                 same page size. They must use the global supervisor
  279.                 context, and therefore cannot allocate a private
  280.                 supervisor context.
  281.  
  282.                 If this tag item is given, all of the context will
  283.                 be initialized as MAPP_SHARED, i.e. the child uses
  284.                 the same MMU setup as the parent.
  285.                 
  286.     MCXTAG_EXECBASE  -  allow accesses of AbsExecBase and all accesses to
  287.                 valid memory in the first page, even if this
  288.                 page in the MMU tree - the "zeropage" - is
  289.                 marked as invalid. This is an important feature
  290.                 if the mmu.library is used to implement an
  291.                 Enforcer type program. 
  292.                 Accesses will be emulated in software and are
  293.                 hence *slow*. They should be avoided, either by
  294.                 running Os 3.0 or better, or by using a tool like
  295.                 "MuMove4k".
  296.  
  297.                 AbsExecBase accesses are handled with highest
  298.                 priority and might be faster than the rest of the
  299.                 emulation, even faster than the Enforcer, even
  300.                 though they're still slower than "the real thing".
  301.                 It is not guaranteed that the library will really
  302.                 read AbsExecBase from location four, dependent on
  303.                 some internals, it might give you a cached copy
  304.                 instead. This means usually no problem since
  305.                 AbsExecBase must not change while the machine is
  306.                 up and running. 
  307.  
  308.                 This option defaults to TRUE.
  309.  
  310.                 For more quirks about the zeropage, read the
  311.                 MCXTAG_ZEROBASE tag documentation below.
  312.  
  313.     MCXTAG_BLANKFILL  - defines a ULONG word fill value for blank
  314.                 memory regions.
  315.             
  316.                 This ULONG is read by the CPU in case a program
  317.                 tries an access to "empty" memory regions. It
  318.                 defaults to 0L, but other values might be use-
  319.                 ful for debugging.
  320.  
  321.     MCXTAG_MEMORYATTRS- An exec memory attributes specifier to be used
  322.                 for allocating memory for the (hardware) MMU
  323.                 tables. Defaults to MEMF_PUBLIC, check 
  324.                 exec/memory.h for other possibilities.
  325.  
  326.     MCXTAG_PRIVATESUPER A boolean value, either TRUE or FALSE. If TRUE,
  327.                 build a private MMU supervisor table for this
  328.                 context, independent of the default supervisor
  329.                 Context. BE WARNED! This means specifically that
  330.                 possible modifications of the default supervisor
  331.                 context will not be carried over to your private
  332.                 supervisor table.
  333.                 Even if you pass in FALSE here, the library might
  334.                 still ignore your choice and build a private
  335.                 supervisor table anyways. This happens if the
  336.                 table layout you've chosen is different to the
  337.                 default table layout, making the user tree in-
  338.                 compatible to the default supervisor tree.
  339.  
  340.                 Not available for sharing contexts, i.e. if
  341.                 MCXTAG_SHARE has been specified.
  342.                 
  343.     MCXTAG_ZEROBASE   - This option takes only effect if MCXTAG_EXECBASE
  344.                 is TRUE and the first page of the MMU table is
  345.                 invalid. This means that the MMU library will
  346.                 emulate accesses to valid memory in the first page
  347.                 which remains unavailable to implement an 
  348.                 "Enforcer" function. This tag provides a base 
  349.                 address to be used by the emulation as physical
  350.                 base address.
  351.                 This tag defaults to NULL meaning that the 
  352.                 library will redirect accesses to the true 
  353.                 zeropage, making it available temporarely, but
  354.                 any other memory location - provided it is page 
  355.                 aligned - can be specified here as well. This
  356.                 is important if the zero page gets remapped to
  357.                 a different location, and an Enforcer type 
  358.                 program is run later on. The zero page remapper
  359.                 should specify this tag to redirect accesses 
  360.                 transparently, even if an Enforcer type 
  361.                 application invalidates the zero page. Failing
  362.                 to do so would make the MMU library emulating
  363.                 the access to the incorrect, non-remapped memory 
  364.                 location. Since other programs might want to
  365.                 build a private MMU table with a different
  366.                 table size, it is *NOT* enough to align the
  367.                 remap destination of the zeropage to GetPageSize()
  368.                 boundaries, RemapSize() alignment is required!
  369.                 THIS IS AN ADVANCED FEATURE.
  370.  
  371.     MCXTAG_DISCACHEDES  A boolean tag item. If set to TRUE, the memory
  372.                 that keeps the descriptors is cache-inhibited.
  373.                 This works around some problems that appear if a
  374.                 program attempts to hack on the MMU itself. The
  375.                 mmu.library code has no problems with descriptors
  376.                 in non-cacheable memory. Note, however, that the
  377.                 memory will be only non-cacheable "as seen" from
  378.                 the context itself. It will *NOT* change the
  379.                 cache mode as seen from other contexts, even from
  380.                 the supervisor Context of the given Context. 
  381.  
  382.                 *HACKING THE MMU TABLES IS ILLEGAL*
  383.  
  384.     MCXTAG_LOWMEMORYLIMIT  Define a boundary in the zero page such that 
  385.                 accesses to addresses higher than this boundary 
  386.                 will be emulated in software. This is mainly for
  387.                 68060/68040 support under Os V37 and V38 where
  388.                 chip memory started at 0x400 inside the zero page.
  389.                 (NEW for V42)
  390.                 The MuLib checks the chip memory base address on
  391.                 startup and provides a useful default.
  392.  
  393.     MCXTAG_SHAREABLE    (V43 and up)
  394.                 A boolean TRUE/FALSE indicator, default is FALSE.
  395.                 If set to TRUE, this context is shareable and
  396.                 allows child contexts to share parts of the table
  397.                 layout of this context by specifying this context
  398.                 as argument to MCXTAG_SHARE.
  399.  
  400.                 This implies various restrictions for the context,
  401.                 though. First of all, you must use the global
  402.                 supervisor context as your supervisor context, and
  403.                 hence must use the same table layout than the
  404.                 default user context. Second, special care must be
  405.                 taken when shutting down the context with 
  406.                 DeleteMMUContext() as this call may now fail,
  407.                 simply because some child contexts are still
  408.                 attached to your context. The next two tags offer
  409.                 a mechanism to control this shutdown.
  410.  
  411.     MCXTAG_SHUTDOWNTASK    (V43 and up)
  412.                 Takes a pointer to a "struct Task" as argument.
  413.                 If non-NULL, then the mmu.library will send a 
  414.                 signal mask, specified by the next tag, to this
  415.                 task as soon as the last task leaves this context
  416.                 by means of LeaveMMUContext(), or as soon as the
  417.                 last child context of this context gets deleted by
  418.                 DeleteMMUContext(). Hence, if this signal arrives,
  419.                 you may try (again) to call DeleteMMUContext(). Note
  420.                 that even then this call may fail.
  421.  
  422.     MCXTAG_SHUTDOWNMASK    (V43 and up)
  423.                 Takes a ULONG as argument that defines a signal
  424.                 mask (not a signal bit!) that will be sent to the
  425.                 task specified above, as soon as the last child
  426.                 detaches from this context.
  427.  
  428.     The next tag items define the MMU table layout. A logical address,
  429.     used as input for the MMU, consists of exactly 32 bits. These
  430.     bits are now split from the left to the right into groups to define
  431.     a "path" in the MMU tree. Each "level" of the MMU tree should be
  432.     considered as an array of pointers, pointing to the next lower
  433.     level of the tree. The nodes of the tree are contain the descriptors
  434.     that define how the address belonging to the path from the root to
  435.     this descriptor should be handled. For example, consider a three-
  436.     level tree with 7 bits for level A and B, 6 bits for level C and
  437.     12 bits for the page. The address 0x01feabcd would be used like this
  438.     to find an descriptor:
  439.  
  440.     hex 0x01feabcd is binary
  441.     
  442.     ----7--- ----7---- ---6--- ------12-------  bits 
  443.     0000 000|1 1111 11|10 1010| 1011 1100 1101
  444.     \_______/\________/\______/\_____________/
  445.         |    |    |       |
  446.         |    |    |       |
  447.         V    |    |       |
  448.     Index into level A of the MMU tree is 0, hence the first pointer
  449.     is read. The MMU obtains now another array of pointers, called
  450.     the level B.     |       |
  451.         |    |       |
  452.         V    |       |
  453.         Index into level B of the MMU tree is 127. The MMU uses
  454.         the last pointer from the table obtained in the previous
  455.         step.    |       |
  456.             |       |
  457.             V       |
  458.             Index into level C of the MMU tree is 42. The MMU
  459.             uses, hence, the 42nd pointer of the array pointed
  460.             to by the 127th pointer of the level B array. This
  461.             is now the "page descriptor", defining the base
  462.             address for the next step.
  463.                    |
  464.                    |
  465.                    V
  466.     This is now finally the page offset, 0xbcd in this example. It
  467.     is added to the base address from the page descriptor in level C.
  468.     If the address is not "remapped", the base address would be
  469.     identically to the first 32-12 = 20 bits of the physically address.
  470.  
  471.     Note that you cannot use all of the following tags if you share parts
  472.     of a parent context by MCXTAG_SHARE. The table layout of the child
  473.     must then be identical to that of the parent.
  474.     
  475.  
  476.     MCXTAG_DEPTH      - Depth of the MMU tree to build. Defaults to
  477.                 the depth of the global public context.
  478.  
  479.                 Legal values are 1..4 for the 68020/68851 and
  480.                 the 68030, but the 68040/68060 supports only
  481.                 trees of depth 3.
  482.  
  483.     MCXTAG_LEVELABITS - Number of bits of the logical address that make
  484.                 up the level A of the MMU tree. 2^bits is the
  485.                 number of entries on this level of the tree.
  486.  
  487.                 The 68020/68851 and the 68030 support here
  488.                 values from 1..15, the only legal value for
  489.                 the 68040 and 68060 is 7. 
  490.  
  491.                 The MMU library will pick a reasonable and
  492.                 system dependent default for you if you don't
  493.                 specify this tag item.
  494.  
  495.     MCXTAG_LEVELBBITS - Number of bits for the level B of the MMU tree,
  496.                 unused if the depth is smaller than two.
  497.  
  498.                 Legal values are 1..15 for the 851 and 030, and
  499.                 7 as only possible value for the 040 and 060.
  500.  
  501.     MCXTAG_LEVELCBITS - Number of bits of the level C of the MMU tree,
  502.                 unused if the depth is smaller than three.
  503.  
  504.                 Arguments may range from 1..15 for the 851 and
  505.                 030, and must be either 5 or 6 for the 040 and
  506.                 060.
  507.  
  508.     MCXTAG_LEVELDBITS - Number of bits in the level D of the MMU tree,
  509.                 only used if the depth is four and therefore
  510.                 unused on the 040 and 060. 
  511.  
  512.                 Must range from 1..15.
  513.  
  514.     MCXTAG_PAGEBITS   - Number of bits to be used from the logical
  515.                 address as the page offset. 2^bits is the
  516.                 page size. 
  517.  
  518.                 Legal values are 8..15, giving 256 bytes up
  519.                 to 32K pages for the 68020/68851 and 68030, or
  520.                 12..13 defining 4K resp. 8K pages for the
  521.                 68040 and 68060. 
  522.  
  523.                 The default is the page size of the global 
  524.                 context.
  525.  
  526.     All the "..."BITS specifications MUST sum up to 32 since a logical
  527.     address consists of exactly 32 bits. You may leave out some or all 
  528.     of these tags, the MMU library will keep care of the rest and will
  529.     chose reasonable defaults for you.
  530.  
  531.  
  532.     MCXTAG_ERRORCODE -  pointer to a ULONG the MMU library will fill
  533.                 in with an error code in case building the
  534.                 MMU tree failed. It will be set to 0L if the
  535.                 function succeeds. The following error codes
  536.                 have been defined:
  537.  
  538.         CCERR_NO_FREE_STORE         -  the library went out of memory.
  539.         CCERR_INVALID_PARAMETERS -  the parameters specified by the 
  540.                     tags are invalid.
  541.         CCERR_UNSUPPORTED         -    the parameters are valid, but 
  542.                     not supported by the hardware.
  543.         CCERR_TRIMMED            -    the library performed some minor
  544.                     adjustments on the MMU table passed
  545.                     in for cloning. The cache modes
  546.                     might not be optimal due to some
  547.                     roudings that have to be performed,
  548.                     but the MMU table should work in
  549.                     general.
  550.  
  551.                     THIS IS NOT AN ERROR, you will get
  552.                     your new context.
  553.  
  554.         CCERR_UNALIGNED         -    the library had to perform heavy
  555.                     rouding in the MMU table passed
  556.                     in, it might be unusable. For 
  557.                     example, remapped pages were mis-
  558.                     aligned and due to the rounding
  559.                     accesses might go to wrong 
  560.                     locations. If you get this return
  561.                     code, you should possibly deallocate
  562.                     the new context and inform the user
  563.                     that the request could not be satis-
  564.                     fied.
  565.  
  566.                     Still, THIS IS NOT AN ERROR. You
  567.                     get a new context, but possibly an
  568.                     usuable one.
  569.  
  570.         CCERR_SHARENCOPY        (V43 and up)
  571.                     MCXTAG_SHARE and MCXTAG_COPY were found
  572.                     both on the tag list, this is illegal.
  573.  
  574.         CCERR_NOTSHAREABLE        (V43 and up)
  575.                     The parent context you specified with
  576.                     MCXTAG_SHARE does not support page
  577.                     sharing and is therefore not shareable.
  578.                     The global user context is aways
  579.                     shareable for V43 and up.
  580.  
  581.         CCERR_SHAREOVERLEVELS    (V43 and up)
  582.                     You specified MCXTAG_SHARE and 
  583.                     MCXTAG_SHAREABLE simulateously and
  584.                     hence tried to build a context that
  585.                     shares a parent and can be shared as
  586.                     well. The current library release does
  587.                     not support sharing over levels, though.
  588.  
  589.         CCERR_NOPRIVSUPER        (V43 and up)
  590.                     You tried to build a context with 
  591.                     MCXTAG_SHARE that uses page sharing
  592.                     but that requires a private supervisor
  593.                     MMU tree. This is currently
  594.                     unsupported.
  595.  
  596.     RETURNS
  597.     NULL if the new context couldn't be created or a handle to the
  598.     new context, as parameter to all MMU library functions.
  599.  
  600.     NOTES
  601.     This call makes NOT the current task entering the new context,
  602.     you've to call EnterMMUContext() explicitly for that purpose.
  603.  
  604.     The context structure is not documented intentionally. It depends
  605.     on the implementation.
  606.  
  607.     BUGS
  608.  
  609.     SEE ALSO
  610.     DeleteMMUContext(), mmu/mmutags.h, mmu/context.h
  611.  
  612.     BUGS
  613.  
  614. mmu.library/DeleteMMUContext           mmu.library/DeleteMMUContext
  615.     
  616.     NAME
  617.     DeleteMMUContext - delete an MMU context build with CreateMMUContext.
  618.  
  619.     SYNOPSIS
  620.     DeleteMMUContext ( context );
  621.                 a0
  622.  
  623.     BOOL DeleteMMUContext ( struct MMUContext * );
  624.  
  625.     FUNCTION
  626.     This function deletes a context build with CreateMMUContext().
  627.  
  628.  
  629.     INPUTS   
  630.     A handle to the context to be deleted.
  631.  
  632.     RETURNS
  633.     For V43: a boolean success/failure indicator. Old code need not
  634.     to check this, but note that the prototypes always specified
  635.     a boolean success indicator. In fact, this indicator was delivered
  636.     correctly for all releases of the mmu.library, even for V40. 
  637.     Hence, you need no version check here to evaluate the result code
  638.     safely.
  639.  
  640.     NOTES
  641.     This call doesn't remove any task from the context, especially the
  642.     current task is NOT removed from the context. You've to call
  643.     LeaveMMUContext() before. 
  644.  
  645.     (V43) In case some tasks are still attached to this context, 
  646.     DeleteMMUContext() will fail. Similary, it will fail if some child
  647.     contexts still share this context. V42 and below would have crashed
  648.     here.
  649.  
  650.     If your context was created with a private supervisor context
  651.     included, you must call this function only *once*, with the
  652.     user context created. It will automatically deallocate the
  653.     attached supervisor context as well. You don't have to delete
  654.     explicitly what you haven't allocated explicitly.
  655.  
  656.     BUGS
  657.  
  658.     SEE ALSO
  659.     CreateMMUContext(), mmu/context.h
  660.  
  661. mmu.library/EnterMMUContext            mmu.library/EnterMMUContext
  662.  
  663.     NAME
  664.     EnterMMUContext - let a task enter a specific context.
  665.  
  666.     SYNOPSIS
  667.     context = EnterMMUContext( context , task );
  668.     d0                 a0       a1
  669.  
  670.     struct MMUContext * EnterMMUContext( struct MMUContext * , 
  671.                          struct Task * );
  672.  
  673.     FUNCTION
  674.     Add a given task to a context. This makes the MMU settings defined
  675.     by the context available for the task in question.
  676.  
  677.     INPUTS
  678.     context - the context to enter or NULL for the global context.
  679.     task    - a pointer to the task structure that should enter the
  680.           context.
  681.  
  682.     RETURNS
  683.     a handle to the context the task participated before or NULL if
  684.     this function failed. The task will stay in the last context used
  685.     in this case.
  686.  
  687.     NOTES
  688.     This call uses the tc_Switch() and tc_Launch() functions of the
  689.     task structure. What basically happens here is that these functions
  690.     are set to internal procedures that swap the context specific
  691.     MMU table or the global MMU in and flush the ATC of the MMU.
  692.  
  693.     This call may fail, check the return code for NULL.
  694.  
  695.     If you want to use the tc_Switch() and tc_Launch() functions your-
  696.     self, you should install a task specific context hook, see 
  697.     AddContextHook().
  698.  
  699.     This function can be used to change the context of a task by
  700.     adding it to a new context. The task specific context switch and
  701.     launch hooks will be "carried over" to the new context, but all
  702.     other MMU specific exceptions are now the matter of the new context.
  703.  
  704.     BUGS
  705.  
  706.     SEE ALSO
  707.     LeaveMMUContext(), exec/tasks.h
  708.  
  709. mmu.library/LeaveMMUContext            mmu.library/LeaveMMUContext
  710.     
  711.     NAME
  712.     LeaveMMUContext - remove a given task from a context.
  713.  
  714.     SYNOPSIS
  715.     context = LeaveMMUContext( task );
  716.     d0              a1
  717.  
  718.     struct MMUContext * LeaveMMUContext( struct Task *);
  719.  
  720.     FUNCTION
  721.     The specified task leaves its context and enters the global context.
  722.  
  723.     INPUTS
  724.     task - the task that should leave its own context and enter the
  725.         global default context.
  726.  
  727.     RETURNS
  728.     the context the task was added to or NULL on failure.
  729.     Might be the global default context if the task did not enter any 
  730.     context.
  731.  
  732.     NOTES
  733.     It is safe to call this function even if the task wasn't added to
  734.     any context. The function returns the global context in this case.
  735.  
  736.     This function must be called to any task participating a given
  737.     context to be able to delete that context.
  738.  
  739.     This function is equivalent to EnterMMUContext(NULL,task). 
  740.  
  741.     This function makes use of the tc_Switch() and tc_Launch() functions
  742.     of the task structure to be able to set the MMU root pointer.
  743.  
  744.     Make sure that you check for failure. This call may return NULL
  745.     for incorrect parameters.
  746.  
  747.     BUGS
  748.  
  749.     SEE ALSO
  750.     EnterMMUContext(), DeleteMMUContext(),  
  751.     RemContextHook(), exec/tasks.h
  752.  
  753. mmu.library/CurrentContext             mmu.library/CurrentContext
  754.  
  755.     NAME
  756.     CurrentContext - find out the current context of a task.
  757.  
  758.     SYNOPSIS
  759.     context = CurrentContext( task );
  760.     d0               a1
  761.  
  762.     struct MMUContext * CurrentContext( struct Task * );
  763.  
  764.     FUNCTION
  765.     This function is used to get a handle to the context the given
  766.     task is added to, or to return the context of the calling task.
  767.  
  768.     INPUTS
  769.     task - the address of the task structure you like to investigate
  770.     or NULL to get a handle to the currently active context.
  771.  
  772.     RETURNS
  773.     a handle to the context the given task is added to, the global
  774.     context if the task is not attached to any context or the
  775.     currently active context if the argument is NULL. 
  776.  
  777.     NOTES
  778.     Unlike former notes, this call cannot fail as context protection
  779.     is no longer a planned feature of the mmu.library.
  780.  
  781.     BUGS
  782.  
  783.     SEE ALSO
  784.     FindTask()
  785.  
  786. mmu.library/AddContextHook             mmu.library/AddContextHook
  787.  
  788.     NAME
  789.     AddContextHook - set an exception handler to a Context
  790.  
  791.     SYNOPSIS
  792.     hook = AddContextHookA ( tags );
  793.                   a0
  794.  
  795.     hook = AddContextHook ( tag1, ... );
  796.  
  797.     
  798.     struct ExceptionHook * AddContextHookA ( struct TagItem * );
  799.  
  800.     struct ExceptionHook * AddContextHook ( Tag tag1, ... );
  801.  
  802.     FUNCTION
  803.     This call installs an exception hook for a given context for
  804.     various exception types the MMU library can provide.
  805.  
  806.     INPUTS
  807.     tags    -   A taglist defining the type of the exception hook
  808.             to be added.
  809.  
  810.     Currently defined are:
  811.  
  812.     MADTAG_CONTEXT  -    The context to which this exception hook
  813.                 should be added. This MUST be given for
  814.                 "swapped" handlers. If it is left blank
  815.                 or set to NULL for segmentation fault
  816.                 handlers, you define a global segmentation
  817.                 fault handler.
  818.  
  819.     MADTAG_TASK    -    If the hook should be called only if a
  820.                 specific task is running, specify a pointer
  821.                 to the task structure here. 
  822.                 Warning! Adding too many task specific
  823.                 hooks slows things down unnecessary.
  824.                 Remember that a MMU Context may hold more
  825.                 than one task.
  826.                 This MUST be given for the switch and launch
  827.                 hooks.
  828.  
  829.     MADTAG_TYPE    -    Type of the exception hook to build. The
  830.                 following types are available:
  831.  
  832.         MMUEH_SEGFAULT  -    Called on segmentation fault, i.e. write to
  833.                 a write protected page or access of an
  834.                 invalid page. Most useful for "Enforcer"
  835.                 like tools.
  836.  
  837.     MMUEH_SWAPPED   -    Called on access for a "swapped out" page.
  838.                 Most useful to implement virtual memory.
  839.  
  840.     MMUEH_SWITCH    -    Called when the task looses the CPU.
  841.     MMUEH_LAUNCH    -    Called when the task gains the CPU.
  842.                 Remember that the tc_Switch() and tc_Launch()
  843.                 function pointers are no longer available
  844.                 if the task has been added to a MMUContext.
  845.  
  846.     MMUEH_PAGEACCESS -    Called whenever a MAPP_SINGLE page gets
  847.                 build by the context. This could be used to
  848.                 modify the MMU tree "on the fly" if 
  849.                 necessary, the required parameters are passed
  850.                 thru.
  851.  
  852.     MADTAG_CODE     -    A function pointer to the code to be called.
  853.                 This should be an assembly language function.
  854.                 It is called like this:
  855.  
  856.     Register a0     -    Pointer to the ExceptionData structure or
  857.                 the PageAccessData.
  858.     Register a1     -    loaded with the MADTAG_DATA provided data.
  859.     Register a4     -    Ditto.
  860.     Register a5     -    Pointer to the code itself.
  861.     Register a6     -    MMUBase. NOT A SCRATCH.
  862.  
  863.     Registers d0-d1/a0-a1/a4-a5 are scratches and are available for the
  864.     Exception handler. You *MUST* set the "Z" condition code and
  865.     clear d0 on exit in case you handled the exception. Details on
  866.     how to write an exception handler are in the "Exception.doc" file.
  867.  
  868.     MADTAG_DATA    -      Data to be loaded for the hook function.
  869.     MADTAG_NAME    -    A name for the hook. Currently unused.
  870.     MADTAG_PRI    -    A priority, ranging from -128...+127.
  871.                 Hooks of higher priorities are called first.
  872.  
  873.     RESULTS
  874.     A handle to the exception hook. Do not interpret this handle.
  875.     Or NULL on failure.
  876.  
  877.     NOTES
  878.     this call is used by the high-level function AddMessageHook().
  879.     The global segmentation fault hook is set by a debugging tool 
  880.     like MuForce.
  881.  
  882.     The exception will not be activated, you need to call 
  883.     ActivateException() explicitly to make the library call it.
  884.  
  885.     Much more needs to be said about this function, see Exception.doc
  886.     and the MMU Manual for details about the exception handlers.
  887.  
  888.     BUGS
  889.  
  890.     SEE ALSO
  891.     RemContextHook(), AddMessageHook(), ActivateException(),
  892.     exec/interrupts.h, Exception.doc
  893.  
  894. mmu.library/RemContextHook             mmu.library/RemContextHook
  895.  
  896.     NAME
  897.     RemContextHook - remove an exception handler from a Context
  898.  
  899.     SYNOPSIS
  900.     RemContextHook( hook )
  901.              a1
  902.  
  903.     void RemContextHook( struct ExceptionHook * );
  904.  
  905.     FUNCTION
  906.     This function removes a previously installed context hook
  907.     from the hook list.
  908.  
  909.     INPUTS
  910.     The handle of the hook, as obtained by AddContextHook().
  911.  
  912.     RESULTS
  913.     none.
  914.  
  915.     NOTES
  916.     You must call DeactivateException() on your hook before you
  917.     remove it.
  918.     Be aware that the library will call the exec exception handler,
  919.     i.e. will generate a guru in case no exception handler is
  920.     available.
  921.  
  922.     SEE ALSO
  923.     AddContextHook(), DeactivateException(), exec/interrupts.h
  924. mmu.library/AddMessageHook             mmu.library/AddMessageHook
  925.  
  926.     NAME
  927.     AddMessageHook - install a high-level hook function.
  928.  
  929.     SYNOPSIS
  930.     hook = AddMessageHookA ( tags );
  931.                   a0
  932.  
  933.     hook = AddMessageHook ( tag1, ... );
  934.  
  935.  
  936.     struct ExceptionHook * AddMessageHookA ( struct TagItem * );
  937.  
  938.     struct ExceptionHook * AddMessageHook ( Tag tag1, ... );
  939.  
  940.     FUNCTION
  941.     Installs a high-level hook of the tag-given properties.
  942.     As soon as an exception of the requested type occurs, an exception 
  943.     message (see below) will be sent to the port. The task that caused 
  944.     the exception will be halted until the message gets replied.
  945.  
  946.     BE WARNED: Message hooks perform only operation if task switching
  947.     is enabled and interrupts are allowed and the code failed in
  948.     User mode. They will just "drop thru" to the next handler if this 
  949.     is not the case.
  950.  
  951.     INPUTS
  952.     tags    -   A taglist defining the type of the exception hook
  953.             to be added.
  954.  
  955.     Currently defined are:
  956.  
  957.     MADTAG_CONTEXT   -    The context to which this exception hook
  958.                 should be added. This MUST be given.
  959.  
  960.     MADTAG_TASK     -    If the hook should be called only if a
  961.                 specific task is running, specify a pointer
  962.                 to the task structure here. 
  963.                 Warning! Adding too many task specific
  964.                 hooks slows things down unnecessary.
  965.                 Remember that a MMU Context may hold more
  966.                 than one task.
  967.  
  968.     MADTAG_TYPE     -    Type of the exception hook to build. The
  969.                 following types are available:
  970.  
  971.     MMUEH_SEGFAULT   -    Called on segmentation fault, i.e. write to
  972.                 a write protected page or access of an
  973.                 invalid page. Most useful for "Enforcer"
  974.                 like tools.
  975.  
  976.         MMUEH_SWAPPED    -    Called on access for a "swapped out" page.
  977.                 Most useful to implement virtual memory.
  978.  
  979.     MADTAG_CATCHERPORT  -   The port to sent the data to.
  980.     MADTAG_NAME        -    A name for the hook. Currently unused.
  981.     MADTAG_PRI        -    A priority, ranging from -128...+127.
  982.                 Hooks of higher priorities are called first.
  983.  
  984.     On an exception, the following message will be sent to the port:
  985.  
  986.     struct ExceptionMessage {
  987.         struct Message        exm_msg;
  988.         struct ExceptionData    exm_Data;
  989.     };
  990.  
  991.     For details about the ExceptionData structure, see Exception.doc or
  992.     the MMU Manual.
  993.  
  994.     Once the message gets replied, the faulted task is restarted.
  995.  
  996.     RESULTS
  997.     a handle for the exception that must be passed back to 
  998.     RemMessageHook() for removal or NULL on failure.
  999.     Do not interpret this handle.
  1000.     
  1001.     NOTES
  1002.     The handler must have been added to a context with EnterMMUContext()
  1003.     before this function can be used. Unlike the AddContextHook() 
  1004.     function, this DOES NOT work for "plain" tasks without a context.
  1005.  
  1006.     The hook must be activated with ActivateException() before it 
  1007.     gets called.
  1008.  
  1009.     This function is used by the memory.library to install its
  1010.     exception handler. The port will be in this case the port of
  1011.     the swapper daemon that loads swapped out pages from disk.
  1012.  
  1013.     BUGS
  1014.     
  1015.     SEE ALSO
  1016.     AddContextHook(), RemContextHook(), RemMessageHook(), 
  1017.     ActivateException(), Exception.doc
  1018.  
  1019. mmu.library/RemMessageHook             mmu.library/RemMessageHook
  1020.  
  1021.     NAME
  1022.     RemMessageHook  -   remove a high-level hook from a context.
  1023.  
  1024.     SYNOPSIS
  1025.     RemMessageHook( handle );
  1026.              a1
  1027.  
  1028.     void RemMessageHook( struct ExceptionHook * );
  1029.  
  1030.  
  1031.     FUNCTION
  1032.     This function removed a previously installed Message hook from
  1033.     the hook list of the context.
  1034.  
  1035.     INPUTS
  1036.     handle - a handle to the message hook as returned by the 
  1037.         AddMessageHook function.
  1038.  
  1039.     RESULTS
  1040.     none.
  1041.  
  1042.     NOTES
  1043.     To remove a message hook safely, deactivate it first with
  1044.     DeactivateException(), then tell the daemon to reply all 
  1045.     exceptions of this hook, then remove it. 
  1046.  
  1047.     Not following these rules may cause deadlocks.
  1048.     
  1049.     BUGS
  1050.     
  1051.     SEE ALSO
  1052.     AddMessageHook(), AddContextHook(), RemContextHook(),
  1053.     DeactivateException(), Exception.doc
  1054.  
  1055. mmu.library/ActivateException          mmu.library/ActivateException
  1056.  
  1057.     NAME
  1058.     ActivateException   -   enable an exception hook.
  1059.  
  1060.     SYNOPSIS
  1061.     ActivateException( hook );
  1062.                 a1
  1063.  
  1064.     void ActivateException( struct ExceptionHook * );
  1065.  
  1066.     FUNCTION
  1067.     Activates a formerly installed exception hook, either a low
  1068.     level context hook or a high-level message hook.
  1069.     
  1070.     RETURNS
  1071.     
  1072.     NOTES
  1073.     Hooks of either kind must be activated before the mmu.library
  1074.     will call them. Hooks are deactivated after creation and must
  1075.     be deactivated before they get removed.
  1076.  
  1077.     This call can be safely used within interrupts and from super-
  1078.     visor mode.
  1079.  
  1080.     BUGS
  1081.  
  1082.     SEE ALSO
  1083.     DeactivateException(), AddContextHook(), AddMessageHook(),
  1084.     Exception.doc
  1085.  
  1086. mmu.library/DeactivateException        mmu.library/DeactivateException
  1087.  
  1088.     NAME
  1089.     DeactivateException -   enable an exception hook.
  1090.  
  1091.     SYNOPSIS
  1092.     DeactivateException( hook );
  1093.                   a1
  1094.  
  1095.     void DeactivateException( struct ExceptionHook * );
  1096.  
  1097.     FUNCTION
  1098.     Deactivates a formerly installed exception hook, either a low
  1099.     level context hook or a high-level message hook, i.e. disables
  1100.     it from being called.
  1101.     
  1102.     RETURNS
  1103.     
  1104.     NOTES
  1105.     Hooks of either kind must be activated before the mmu.library
  1106.     will call them. Hooks are deactivated after creation and must
  1107.     be deactivated before they get removed.
  1108.     This call can be safely used within interrupts and from super-
  1109.     visor mode.
  1110.  
  1111.     BUGS
  1112.  
  1113.     SEE ALSO
  1114.     ActivateException(), RemContextHook(), RemMessageHook(),
  1115.     Exception.doc
  1116.  
  1117. mmu.library/GetPageSize                mmu.library/GetPageSize
  1118.  
  1119.     NAME
  1120.     GetPageSize - return the page size of a context.
  1121.  
  1122.     SYNOPSIS
  1123.     pagesz = GetPageSize( context );
  1124.     d0            a0
  1125.  
  1126.     ULONG GetPageSize( struct MMUContext * );
  1127.  
  1128.     FUNCTION
  1129.     This function returns the page size selected by the MMU library for
  1130.     the given context. Possible page sizes are limited by the hardware
  1131.     and cannot be adjusted from the outside. The page size is set up
  1132.     by the MMU library for the global public context, and it can be
  1133.     selected from the available page sizes for private MMUContexts, see
  1134.     CreateMMUContext().
  1135.  
  1136.     INPUTS
  1137.     context - a handle to the context to be investigated or NULL for
  1138.         the active context.
  1139.  
  1140.     RESULTS
  1141.     the page size in bytes
  1142.  
  1143.     NOTES
  1144.  
  1145.     BUGS
  1146.  
  1147.     SEE ALSO
  1148.     CreateMMUContext()
  1149.  
  1150. mmu.library/GetPageUsedModified            mmu.library/GetPageUsedModified
  1151.  
  1152.     NAME
  1153.     GetPageUsedModified - read and clear the MAPP_USED and MAPP_MODIFIED
  1154.     flags of a page (V43)
  1155.  
  1156.     SYNOPSIS
  1157.     flags = GetPageUsedModified( context, lower );
  1158.     d0                a0    a1
  1159.  
  1160.     ULONG GetPageUsedModified( struct MMUContext *, ULONG lower );
  1161.  
  1162.     FUNCTION
  1163.     This low-level call extracts the MAPP_USED and MAPP_MODIFIED bits
  1164.     for the memory page whose address is given as the second argument,
  1165.     indicating whether the memory page was read from (MAPP_USED) or
  1166.     written to (MAPP_MODIFIED) since the last call of this function,
  1167.     or an explicit SetPageProperties() to clear these flags.
  1168.  
  1169.     The state of the MAPP_USED and MAPP_MODIFIED flags is returned as
  1170.     a bit mask, and both flags are cleared in the page descriptor. 
  1171.  
  1172.     INPUTS
  1173.     context    -    a handle for the MMUContext the page is controlled
  1174.         by or NULL for the active context
  1175.  
  1176.     lower    -    the (logical) base address of the memory page whose
  1177.         usage/modification flags are to be investigated
  1178.  
  1179.    RESULTS
  1180.     a bitmask comprising of MAPP_USED and/or MAPP_MODIFIED describing
  1181.     whether and how the indicated page was touched since the last call
  1182.     of this function.
  1183.     Furthermore, this call clears both flags in the page descriptor.
  1184.  
  1185.    NOTES
  1186.     This is a low-level call, it is interrupt-callable. Note further
  1187.     that this function is atomic in the sense that no access to the
  1188.     inquiried memory page is allowed after reading and before clearing
  1189.     the flags, even though the state of the page might change
  1190.     immediately after return of this function due to a possible task
  1191.     switch.
  1192.  
  1193.     This function will not return any other property flags; its sole
  1194.     purpose is to drive the state machine of a virtual memory system
  1195.     in a more effective way than GetPageProperties() and
  1196.     SetPageProperties() could.
  1197.  
  1198.     Note that SetPageProperties() is capable to set or clear the USED
  1199.     and MODIFIED bits as well, but SetProperties() resp. RebuildTree(s)()
  1200.     can only set these bits, but not clear them. This is intentionally
  1201.     and required to keep both flags consistent even if RebuildTree(s)()
  1202.     is called in between.
  1203.    BUGS
  1204.  
  1205.    SEE ALSO
  1206.     GetPageProperties(), SetPageProperties()
  1207.  
  1208. mmu.library/RemapSize                mmu.library/RemapSize
  1209.  
  1210.     NAME
  1211.     RemapSize - return the block size for memory remapping.
  1212.  
  1213.     SYNOPSIS
  1214.     remapsize = RemapSize( context );
  1215.     d0             a0
  1216.  
  1217.     ULONG RemapSize( struct MMUContext * );
  1218.  
  1219.     FUNCTION
  1220.     This function returns the smallest possible block size, and
  1221.     therefore the alignment restrictions for remapping of memory that
  1222.     should be added to the exec memory pool. Since the MMU tables have
  1223.     to be placed in non-fragmented memory, certain alignment 
  1224.     restrictions for the memory blocks the MMU tables are placed in
  1225.     arise. 
  1226.     This harder aligment condition is only required for memory
  1227.     that is put into the exec free list, but as long as remapped
  1228.     memory is never returned from AllocMem, the page size is good 
  1229.     enough.
  1230.  
  1231.     INPUTS
  1232.     context - a handle to the context to be investigated or NULL for
  1233.         the active context.
  1234.  
  1235.     RESULTS
  1236.     the smallest admissable block size for memory returned by 
  1237.     AllocMem().
  1238.  
  1239.     NOTES
  1240.     Even though the mmu.library does support memory remapping, this
  1241.     does not mean all other programs do. For example, remember that
  1242.     the inputs to the "MAPP_REMAPPED" pages is a physical page address,
  1243.     hence your program has to translate the logical address obtained
  1244.     by AllocMem() to a physical address at first. This can be done 
  1245.     with the PhysicalLocation() function.
  1246.     
  1247.     Additionally, DMA devices might or might not support memory
  1248.     remapping, just for the same reason: They require physical, not
  1249.     logical addresses. The MMU library provides a translation mechanism
  1250.     in form of the ChachePreDMA() and CachePostDMA() functions of
  1251.     ExecBase, but not all DMA device drivers call these functions
  1252.     properly. Certain patches might be made available for devices
  1253.     not following this rule.
  1254.  
  1255.     BUGS
  1256.     Adding remapped memory to the freelist is highly untested and
  1257.     not recommended because of the quirks of this mechanism.
  1258.  
  1259.     SEE ALSO
  1260.     PhysicalLocation(), GetPageSize(), exec/CachePreDMA(),
  1261.     DMAInitiate()
  1262.  
  1263. mmu.library/SetProperties             mmu.library/SetProperties
  1264.  
  1265.     
  1266.     NAME
  1267.     SetProperties - set memory attributes for a given logical range.
  1268.  
  1269.     SYNOPSIS
  1270.  
  1271.     result = SetPropertiesA( context, flags, mask, lower, size, tags);
  1272.     d0                a0      d1    d2     a1    d0    a2
  1273.  
  1274.     BOOL SetPropertiesA( struct MMUContext *, ULONG, ULONG, ULONG, ULONG,
  1275.                  struct TagItem *);
  1276.  
  1277.  
  1278.     result = SetProperties( context, flags, mask, lower, size, tag1, ...);
  1279.  
  1280.     BOOL SetProperties( struct MMUContext *, ULONG, ULONG, ULONG, ULONG,
  1281.                 Tag tag1, ...);
  1282.  
  1283.     FUNCTION
  1284.     This call sets attributes of a certain memory range of the
  1285.     software abstraction layer of the MMU tree, aligned to page 
  1286.     boundaries.
  1287.  
  1288.     INPUTS
  1289.     context - a handle to the context to modify or NULL for the active
  1290.         context.
  1291.  
  1292.     flags   - a binary flags field for the attributes to define. The
  1293.         following bits have been defined:
  1294.  
  1295.         MAPP_WRITEPROTECTED  -  The page will be write 
  1296.             protected. Writes to this area will cause a segmentation
  1297.             fault.
  1298.  
  1299.         MAPP_ROM         - Read only memory, writes tolerated.
  1300.             This is almost identically to MAPP_WRITEPROTECTED except
  1301.             that writes into this area will not cause a call of the
  1302.             segmentation fault handler. The library will filter them
  1303.             out.
  1304.             This property can be used to simulate a ROM in RAM and
  1305.             might be useful for kickstart remappers.
  1306.  
  1307.         MAPP_USED         -   The "used" bit of the pages
  1308.             will be set. The CPU will set this bit automatically
  1309.             as soon as the pages are accessed.
  1310.  
  1311.             This flag will turn on the "USED" bit in the hard-
  1312.             ware MMU bit. NOT setting this flag means that the
  1313.             USED bit in the hardware tree is preserved, regard-
  1314.             less of the mask value.
  1315.  
  1316.         MAPP_MODIFIED         -   The "modified" bit of the pages
  1317.             will be set. The CPU will set this bit automatically
  1318.             as soon as a write is performed to the page in question.
  1319.             DO NOT SET THIS BIT TOGETHER WITH MAPP_WRITEPROTECTED
  1320.             OR WITHOUT MAPP_USED or the CPU might hang. 
  1321.  
  1322.             This flag will turn on the "MODIFIED" bit in the hard-
  1323.             ware MMU bit. NOT setting this flag means that the
  1324.             MODIFIED bit in the hardware tree is preserved, regard-
  1325.             less of the mask value.
  1326.  
  1327.         MAPP_INVALID         -   The page will be marked as 
  1328.             invalid. Accessing it will invoke the bus error hook.
  1329.             User data can be provided for this property mode,
  1330.             provided you don't select MAPP_SINGLEPAGE or 
  1331.             MAPP_REPAIRABLE as well.
  1332.  
  1333.         MAPP_SWAPPED         -   The page will be marked as
  1334.             swapped out.
  1335.             A block ID *MUST* be provided for this property mode.
  1336.  
  1337.         MAPP_CACHEINHIBIT    -   The page will be marked as non-
  1338.             cacheable.
  1339.  
  1340.         MAPP_IMPRECISEEXECPTION -   The page will be marked as 
  1341.             "imprecise exception". MAPP_CACHEINHIBIT is mandatory
  1342.             in this case or this flag does nothing.
  1343.             Only available for the 68060, but does not harm for
  1344.             other MMUs.
  1345.  
  1346.         MAPP_NONSERIALIZED   -   The page will be marked as
  1347.             serialized. MAPP_CACHEINHIBIT is mandatory if this
  1348.             property is selected. 
  1349.             Only available for the 68040, but does not harm for
  1350.             other MMUs.
  1351.  
  1352.         MAPP_COPYBACK         -   The page will be marked as
  1353.             "copyback" instead of "writethrough". Generally re-
  1354.             commended since this is faster for the '40 and '60.
  1355.             Only available for 68040 and 68060, but does not harm
  1356.             if selected for other MMUs. MAPP_CACHINHIBIT MUST NOT
  1357.             be selected.
  1358.     
  1359.         MAPP_REMAPPED         -   Map the page to a different
  1360.             memory location. Parameters are given in the tag items.
  1361.  
  1362.             Even though this seems simple, remapping memory is
  1363.             full of quirks. Obviously, DMA devices and the MMU
  1364.             itself see the true physical addresses and not the
  1365.             logical addresses as filtered by the MMU. Therefore,
  1366.             adding remapped memory to the exec.library freelist
  1367.             will cause nothing than trouble and hard to trace
  1368.             disk faults and crashes as soon as this memory is
  1369.             used by a DMA device or the mmu.library itself.
  1370.             (Note that even though the library is supposed to
  1371.              support this, this is currently untested)
  1372.             Even though there *are* documented methods how to
  1373.             prepare a DMA transfer for remapped memory, USING
  1374.             these exec function calls is unfortunately the 
  1375.             exception. Therefore, this method is currently un-
  1376.             supported, by most (!really!) DMA device drivers. 
  1377.             Amongst the broken devices are the gvpscsi.device 
  1378.             and the cybscsi.device, to give just two examples.
  1379.  
  1380.             The omniscsi.device (the "Guru ROM") can be fixed
  1381.             with the MuOmniScsiPatch.
  1382.  
  1383.             If you really *MUST* remap public memory, then align
  1384.             it *AT LEAST* to the border given by RemapSize().   
  1385.             Just page alignment WILL NOT BE ENOUGH due to the way
  1386.             how the library works internally.   
  1387.  
  1388.             YOU HAVE BEEN WARNED!
  1389.             
  1390.         MAPP_SUPERVISORONLY  -   The page will be not available
  1391.             for user programs.
  1392.  
  1393.             NOTE: This mode is currently implemented using invalid 
  1394.             page descriptors for the user pages and is ignored
  1395.             when building supervisor tables. This method saves some
  1396.             space for the 68040 and 68060 and was the only way how
  1397.             it could be done for the 68030 and 68851 without using
  1398.             MMU tables twice as large.
  1399.  
  1400.         MAPP_USERPAGE0         -   Set user page attribute 0.
  1401.             This selects the user page attribute 0 for the 68040
  1402.             and 68060. "USER" DOES NOT MEAN YOU!
  1403.             The status of this bit appears on special pins of the
  1404.             CPU and might be required by some hardware, so don't    
  1405.             play with this. You should not change this bit, by no
  1406.             means.
  1407.  
  1408.         MAPP_USERPAGE1         -   Set user page attribute 1.
  1409.             This selects the user page attribute 0 for the 68040
  1410.             and 68060. See above for warnings.
  1411.  
  1412.         MAPP_GLOBAL         -   The pages are part of the
  1413.             global (public) memory. 
  1414.             You should not set this bit manually, it is under
  1415.             control of the library to optimize table flushes.
  1416.             (Not yet supported)
  1417.  
  1418.         MAPP_BLANK         -   Blank memory.
  1419.             The pages are mapped to one special area in RAM so
  1420.             erraneous reads and writes to these pages won't harm. 
  1421.             MAPP_BLANK should ONLY be used to mark special memory
  1422.             areas as "non-available" and un-handled by the hardware,
  1423.             nothing else. 
  1424.  
  1425.         MAPP_SHARED (V43)     -   Properties are (partially)
  1426.             identical to the context specified by MAPP_SHARE
  1427.             on CreateMMUContext(). If MAPP_SHARE has not been given
  1428.             on context creation, this tag is illegal and will cause
  1429.             a Guru on RebuildTree(s).
  1430.  
  1431.             Unlike specified before, MAPP_SHARED pages are updated
  1432.             automatically as soon as the shared parent context gets
  1433.             modified.
  1434.  
  1435.             You may tell the mmu.library to selectively share only
  1436.             some properties of the parent. Use the MAPTAG_SHAREMASK
  1437.             to setup this mask, and control all other properties
  1438.             that are not shared by or-ing them to MAPP_SHARED.
  1439.  
  1440.             This mechanism has some restrictions as you may currently
  1441.             not enable MAPP_REMAPPED, MAPP_SWAPPED, MAPP_INDIRECT,
  1442.             MAPP_BUNDLED and MAPP_INVALID selectively here, i.e. the
  1443.             mentioned properties cannot be or'ed to MAPP_SHARED. If
  1444.             you want to enable these properties in the child context
  1445.             without having them enabled in the parent, detach the
  1446.             corresponding page from the parent completely, i.e. do
  1447.             not use MAPP_SHARED.
  1448.  
  1449.             However, it is perfectly fine to share the mentioned
  1450.             properties from the parent by having them set in the
  1451.             MAPTAG_SHAREMASK, or to disable these properties
  1452.             selectively by setting the appropriate bits to zero within
  1453.             the MAPTAG_SHAREMASK.
  1454.  
  1455.         MAPP_TRANSLATED        -   Under control of the TTx registers.
  1456.             *NEVER SET THIS BIT YOURSELF.*
  1457.             Pages with the "MAPP_TRANSLATED" bit set are under
  1458.             control of the "transparent translation registers" of
  1459.             the MMU and are "out of scope" for the mmu.library.
  1460.             Defining any properties for this domain will do nothing
  1461.             (or little, dependent on the TTx register configuration).
  1462.             A virtual memory program MUST NOT use virtual addresses
  1463.             which are transparently translated, this won't work.
  1464.             The mmu.library tries to be smart about the TTx registers
  1465.             and disables "unuseful" TTx settings itself. This bit
  1466.             will almost never be active.
  1467.  
  1468.         MAPP_INDIRECT         -   Map to a user provided page
  1469.             descriptor.
  1470.             The provided pages(s) are mapped by a user provided
  1471.             page descriptor. This page descriptor MUST BE aligned
  1472.             to a long word address, and it MUST BE a valid page
  1473.             descriptor for the MMU used.
  1474.  
  1475.             NEVER EVER attempt DMA, such as harddisk reads or
  1476.             writes to a memory domain marked as MAPP_INDIRECT.
  1477.  
  1478.             Due to some cache peculatities, the data might be
  1479.             incorrect and the result would be corrupt data.
  1480.  
  1481.             The library will be able to mark pages as non-cacheable
  1482.             if this is required for the DMA transfer, but this
  1483.             magic does not work for indirect pages.
  1484.  
  1485.             JUST DON'T DO THAT, MAPP_INIDIRECT is definitely an
  1486.             advanced feature.
  1487.  
  1488.         MAPP_BUNDLED         -   Map all pages in range to
  1489.             a single page in RAM.
  1490.  
  1491.             The main purpose of this function is to provide a
  1492.             MAPP_BLANK property with a user-selectable target
  1493.             page.
  1494.  
  1495.         MAPP_SINGLEPAGE         -   Make this page available for
  1496.             SetPageProperties().
  1497.  
  1498.             WARNING! Setting this bit shortcuts some optimizations
  1499.             the library might perform on the MMU table. The system
  1500.             may easely run out of memory if you select this
  1501.             property for "too many" pages.
  1502.  
  1503.         MAPP_REPAIRABLE         -   Inform the exception handler
  1504.             to provide write data and to allow pipeline fill.
  1505.  
  1506.             If this bit is set, the exception handler gets informed
  1507.             that you want to know the write data in case writes
  1508.             fail, or you want to provide the read data in case
  1509.             reads fail. The read/write data is available in the
  1510.             ExceptionData structure, read the exception handler
  1511.             documentation.
  1512.  
  1513.             This flag should be combined with MAPP_INVALID,
  1514.             MAPP_WRITEPROTECTED, MAPP_SWAPPED or 
  1515.             MAPP_SUPERVISORONLY
  1516.  
  1517.             However, this technique requires a lot of "trickery"
  1518.             and should be expected to be slow and to create
  1519.             sub-optimal and over-sized MMU tables. Use it with
  1520.             care, on as few pages as possible and only if your
  1521.             exception handler is "not on a hurry".
  1522.  
  1523.             This tag is NOT required in case you want to repair
  1524.             a page fault by providing the faulty page. This will
  1525.             work always, and a typical VMM implementation need not,
  1526.             and in fact, should not set this. 
  1527.             This tag is required as soon as you need to access the
  1528.             CPU pipelines and require access to the data the CPU
  1529.             "shall read" or "tried to write".
  1530.  
  1531.         MAPP_USERATTRIBUTE0  -   This is for your private use.
  1532.             This bit does not have any specific function, it is
  1533.             for your private use.
  1534.  
  1535.         MAPP_USERATTRIBUTE1  -   This is for your private use.
  1536.         MAPP_USERATTRIBUTE2
  1537.         MAPP_USERATTRIBUTE3
  1538.  
  1539.  
  1540.     mask    -   A bit mask of the attributes to be changed.
  1541.  
  1542.         Note that the hardware USED and MODIFIED bits will never
  1543.         be cleared, even though the properties say so and the
  1544.         corresponding bits in the mask are set. However, you can
  1545.         force them "ON" if you like, this saves unnecessary write-
  1546.         backs of the MMU.
  1547.     
  1548.     lower   -   The lower boundary of the logical address to be 
  1549.         modified. This must be aligned to the page size or this call
  1550.         will guru.
  1551.  
  1552.     size    -   Size of the region to be modified. Must be a multiple
  1553.         of the page size.
  1554.  
  1555.     tags    -   A tag array with additional data. Currently defined:
  1556.  
  1557.         MAPTAG_DESTINATION   -   the physical destination of the
  1558.             logical address. Must be provided for the MAPP_MAPPED
  1559.             or MAPP_BUNDLED bits. 
  1560.  
  1561.         MAPTAG_BLOCKID       -   a unique ID the MMU.library doesn't
  1562.             care about, for external usage of the memory.library.
  1563.             Must be provided for the MAPP_SWAPPED flag and may be
  1564.             used to indicate where on disk the swapped page is
  1565.             kept.
  1566.         
  1567.         MAPTAG_USERDATA      -   a unique cookie you might provide
  1568.             for MAPP_INVALID pages and which is passed thru to the
  1569.             segmentation fault exception handler.
  1570.  
  1571.         MAPTAG_DESCRIPTOR    -   a pointer to a long word aligned
  1572.             table descriptor for MAPP_INDIRECT.
  1573.  
  1574.         MAPTAG_SHAREMASK     -     a bitmask used for MAPP_SHARED only
  1575.             that defines which properties of the parent shall be
  1576.             carried over to the child. Defaults to ~0, i.e. all
  1577.             properties.
  1578.         
  1579.  
  1580.     RESULTS
  1581.     A boolean success/failure indicator. 
  1582.  
  1583.     NOTES
  1584.     This call adjusts only the abstraction layer of the MMU table
  1585.     and marks the pages as "dirty". An explicit call to 
  1586.     RebuildTree() is required to make the changes active.
  1587.     You should bundle changes to the MMU table and call RebuildTree()
  1588.     once when you're done because rebuilding the MMU tree is a costy
  1589.     operation.
  1590.     If you need to modify the MMU table "on the fly" then consider
  1591.     using "SetPageProperties()", even though its use is restricted
  1592.     to single pages. Even faster are MAPP_INDIRECT pages, but - to
  1593.     say that again - DO NOT PERFORM DMA ON THESE PAGES.
  1594.  
  1595.     The page size can be read with GetPageSize(). 
  1596.  
  1597.     SUPERVISORONLY, SWAPPED and INVALID memory are implemented 
  1598.     using the same MMU attributes (invalid, namely), but the 
  1599.     library exception handler will filter them out and call 
  1600.     the appropriate hook.
  1601.  
  1602.     You may freely mark the first memory page as INVALID provided
  1603.     the context MCXTAG_EXECBASE flag is set (it usually is).
  1604.     Long word read accesses to AbsExecBase will be filtered out by 
  1605.     the exception handler of the library and will be satisfied trans-
  1606.     parently to the program, as well as all other accesses except
  1607.     those into the first 1024 bytes.
  1608.  
  1609.     BUGS
  1610.     If the mask contains any property that requires user data, i.e.
  1611.     MAPP_REMAPPED or MAPP_SWAPPED, you *have* to redefine the user 
  1612.     data by tag items and MAY NOT leave them out, as the library 
  1613.     WILL NOT be able to restore the previously defined user data.
  1614.  
  1615.     Some combinations will simply not work, namely those that require
  1616.     more than one user data at once. Hence, MAPP_INVALID, MAPP_SWAPPED,
  1617.     MAPP_BUNDLED, MAPP_INDIRECT, MAPP_REMAPPED and MAPP_SHARED are
  1618.     mutually exclusive.
  1619.  
  1620.     SEE ALSO
  1621.     GetProperties(), AddContextHook(), GetPageSize(), 
  1622.     RemapSize(), RebuildTree(), SetPageProperties(),   
  1623.     SetMappingProperties()
  1624.  
  1625. mmu.library/SetPageProperties             mmu.library/SetPageProperties
  1626.  
  1627.     NAME
  1628.     SetPageProperties - set hardware memory attributes for a single
  1629.     page.
  1630.  
  1631.     SYNOPSIS
  1632.  
  1633.     result = SetPagePropertiesA( context, flags, mask, lower, tags);
  1634.     d0                a0    d1    d2    a1     a2
  1635.  
  1636.     BOOL SetPagePropertiesA( struct MMUContext *, ULONG, ULONG, ULONG,
  1637.                  struct TagItem *);
  1638.  
  1639.  
  1640.     result = SetPageProperties( context, flags, mask, lower, tag1, ...);
  1641.  
  1642.     BOOL SetPageProperties( struct MMUContext *, ULONG, ULONG, ULONG, 
  1643.                 Tag tag1, ...);
  1644.  
  1645.     FUNCTION
  1646.     This call sets the hardware attributes of a memory page.
  1647.  
  1648.     INPUTS
  1649.     context - a handle to the context to modify or NULL for the active
  1650.         context.
  1651.  
  1652.     flags   -   a binary flags field for the attributes to define. For
  1653.             the available attributes, see the SetProperties()
  1654.             function.
  1655.  
  1656.             Differences:
  1657.  
  1658.             MAPP_MODIFIED and MAPP_USED are really set or cleared
  1659.             in the true hardware table, the mask is considered
  1660.             correctly.
  1661.  
  1662.             Note that this function is the only method to clear
  1663.             these two hardware flags, SetProperties() or
  1664.             RebuildTree() don't do this.
  1665.  
  1666.     mask    -   a bit mask of all bits to be changed.
  1667.  
  1668.     tags    -   A tag array with additional data. Check 
  1669.             SetProperties() for details.
  1670.  
  1671.     RESULTS
  1672.     A boolean success/failure indicator. Will only fail for incorrect
  1673.     parameters or if the page is not marked as MAPP_SINGLEPAGE.
  1674.  
  1675.     NOTES
  1676.     BE WARNED! This function is very restricted in its use. It may well
  1677.     return FALSE even if all parameters are valid due to hardware 
  1678.     restrictions. This function does never ever rebuild an MMU tree,
  1679.     it just modifies "what is there". If the library choose to optimize
  1680.     the MMU library tree and to map a couple of pages by one descriptor,
  1681.     for what reasons ever, this call will fail. The details when this
  1682.     happens depends not only on the MMU, but on the general system
  1683.     layout.
  1684.  
  1685.     The ONLY documented way to get a mapping for a page that can be
  1686.     adjusted using this call is to set the page to MAPP_SINGLEPAGE using
  1687.     SetProperties() before.
  1688.  
  1689.     This call adjusts the hardware level of the MMU table if a descriptor 
  1690.     is available for a single page. It does not modify more than one
  1691.     page at once.
  1692.  
  1693.     It might happen that the library does not satisfy a request
  1694.     setting a page as "cacheable" if a DMA operation is currently in
  1695.     progress and the page must remain "nonacheable". However, the
  1696.     function will not fail in this case, but just delay the operation
  1697.     until the DMA is complete. The properties will always fall back to
  1698.     the next available cache mode.
  1699.  
  1700.     This routine is safe to be called from within interrupts, it does
  1701.     not break any Forbid() or Disable() and is ideal for 
  1702.     quick-and-dirty repair operations within exceptions handlers,
  1703.     provided the MAPP_SINGLEPAGE flag has been set. 
  1704.  
  1705.     MAPP_SHARED does not have the "obvious meaning" here.
  1706.     If a page is build with MAPP_SHARED enabled, GetPageProperties()
  1707.     will return the effective properties for this page which are build
  1708.     from combining the properties of the parent context, filtered by
  1709.     the MAPTAG_SHAREMASK of the page, or'ed by the remaining properties.
  1710.     Similarly, SetPageProperties() with MAPP_SHARED set will not
  1711.     automatically carry any properties from the parent over in any
  1712.     event. In fact, it is ignored by the low-level functions completely.
  1713.     Timing and the access protocol is considered too critical to
  1714.     allow this.
  1715.  
  1716.     BUGS
  1717.     Note that MAPP_SINGLEPAGE is the flag you want here, not 
  1718.     MAPP_REPAIRABLE. That's something different!
  1719.  
  1720.     If the mask contains any property that requires user data, i.e.
  1721.     MAPP_REMAPPED or MAPP_SWAPPED, you *have* to re-define the user 
  1722.     data by tag items and MAY NOT leave them out, as the library 
  1723.     WILL NOT be able to restore the previously defined user data.
  1724.  
  1725.     MAPP_SHARED does not work for this low-level function.
  1726.  
  1727.     SEE ALSO
  1728.         GetPageProperties(), AddContextHook(), 
  1729.         GetPageSize(), RebuildTree(), SetProperties(),
  1730.         SetMappingProperties()
  1731. mmu.library/RebuildTree                mmu.library/RebuildTree
  1732.  
  1733.     NAME    
  1734.     RebuildTree - build a MMU hardware tree from the software abstraction
  1735.     layer.
  1736.  
  1737.     SYNOPSIS
  1738.     result = RebuildTree( context );
  1739.     d0            a0
  1740.  
  1741.     BOOL RebuildTree ( struct MMUContext * );
  1742.  
  1743.     FUNCTION
  1744.     This function adjusts the MMU hardware tree to reflect the settings
  1745.     of the software abstraction layer defined with SetProperties().
  1746.  
  1747.     INPUTS
  1748.     context - a handle to the context to investigate or NULL for the
  1749.     active context.
  1750.  
  1751.     RESULTS
  1752.     a boolean success/failure indicator. TRUE if the operation was
  1753.     performed successfully.
  1754.  
  1755.     NOTES
  1756.     This is the big - and admittedly - slow one.
  1757.  
  1758.     Rebuilding the MMU tree is a relatively slow operation. The library
  1759.     tries to be smart about it and rebuilds only the pages whose
  1760.     mappings have been adjusted, but it's still a heavy beast. This goes
  1761.     even more for contexts that are shared by several children as a
  1762.     RebuildTree() on the parent will trigger a partial(!) table rebuild
  1763.     for the child.
  1764.  
  1765.     Properties temporarely defined with SetPageProperties() will be
  1766.     lost after the rebuild, except for the MAPP_USED and MAPP_MODIFIED
  1767.     bits. If you want to avoid this, you need to install a page access
  1768.     handler into your context and modify the properties installed by
  1769.     the mmu.library "on the fly" while it is rebuilding your context,
  1770.     see AddContextHook().
  1771.  
  1772.     In case of failure, the hardware layer will remain valid and un-
  1773.     changed, but the context remains marked as "dirty".
  1774.  
  1775.     BE WARNED! A consistent use of the U/M flags is only possible
  1776.     if the pages are marked as MAPP_SINGLE. The page building algorithm
  1777.     does not guarantee consistent use of these two bits except for
  1778.     MAPP_SINGLEPAGE pages. Even though it *might* look well most the time,
  1779.     it is not documented that these two bits are kept correctly for non-
  1780.     SINGLE pages. 
  1781.  
  1782.     Even though some pages in the abstraction layer might be marked as
  1783.     un-USED or un-MODIFIED, this routine NEVER clears the hardware bits.
  1784.     It requires a call to SetPageProperties(), and hence the MAPP_SINGLE
  1785.     attribute (once again!) to do this.
  1786.  
  1787.     BUGS
  1788.     Much more should be said about this function.
  1789.  
  1790.     SEE ALSO
  1791.     SetProperties(), SetPageProperties(), GetProperties(),
  1792.     GetPageProperties(), RebuildTrees()
  1793.  
  1794. mmu.library/RebuildTrees              mmu.library/RebuildTrees
  1795.  
  1796.     NAME    
  1797.     RebuildTrees - build a MMU hardware tree from the software abstraction
  1798.     layer for several contexts at once.                 (V41)
  1799.  
  1800.     SYNOPSIS
  1801.     result = RebuildTreesA( contextptrptr );
  1802.     d0                 a0
  1803.  
  1804.     result = RebuildTrees( context, context, ... );
  1805.  
  1806.  
  1807.     BOOL RebuildTreesA ( struct MMUContext ** );
  1808.  
  1809.     BOOL RebuildTrees ( struct MMUContext, ... ); 
  1810.  
  1811.     FUNCTION
  1812.     This function adjusts the MMU hardware tree to reflect the settings
  1813.     of the software abstraction layer defined with SetProperties().
  1814.  
  1815.     Like RebuildTree(), this call adjusts several MMUContexts at once,
  1816.     and ensures that either all contexts are valid afterwards, or all
  1817.     contexts remain untouched. The advantage of using RebuildTrees()
  1818.     rather than several calls to RebuildTree() is that you may end up
  1819.     in the latter case with a situation where only one of several 
  1820.     MMUContexts could not rebuild, making an un-do operation hard.
  1821.  
  1822.     INPUTS
  1823.     contextptrptr - a pointer to a NULL terminated array of context
  1824.     handles.
  1825.  
  1826.     RESULTS
  1827.     a boolean success/failure indicator. TRUE if the operation was
  1828.     performed successfully and all context could have been rebuild.
  1829.  
  1830.     NOTES
  1831.     See the notes for RebuildTree().
  1832.  
  1833.     BUGS
  1834.  
  1835.     SEE ALSO
  1836.     SetProperties(), SetPageProperties(), GetProperties(),
  1837.     GetPageProperties(), RebuildTree()
  1838.  
  1839. mmu.library/GetProperties             mmu.library/GetProperties
  1840.  
  1841.     NAME
  1842.     GetProperties - read memory attributes for a given logical page
  1843.     from the MMU table abstraction layer.
  1844.  
  1845.     SYNOPSIS
  1846.  
  1847.     flags = GetPropertiesA( context, lower, tags);
  1848.     d0              a0      a1     a2
  1849.  
  1850.     ULONG GetPropertiesA( struct MMUContext *, void *, struct TagItem *);
  1851.  
  1852.  
  1853.     flags = GetProperties( context, lower, tag1, ...);
  1854.  
  1855.     ULONG GetProperties( struct MMUContext *, void *, Tag tag1, ...);
  1856.  
  1857.     FUNCTION
  1858.     This call reads the page properties of a certain address in
  1859.     memory from the software abstraction layer. It is the counterpart
  1860.     of SetProperties().
  1861.  
  1862.     INPUTS
  1863.     context - a handle to the context to investigate or NULL for the
  1864.         active context.
  1865.  
  1866.     lower   - the logical address of the page to investigate. The
  1867.         size of the page depends on the hardware and is selected by
  1868.         the MMU library. The number of bytes in a page is returned
  1869.         by GetPageSize().
  1870.  
  1871.     tags    - additional tags. Currently defined are:
  1872.  
  1873.         MAPTAG_DESTINATION  -   a pointer to a void * where 
  1874.             the physical destination of the logical address is
  1875.             filled in. Only available if the page is physically
  1876.             mapped to somewhere. Not filled in otherwise.
  1877.  
  1878.         MAPTAG_BLOCKID      -   read the a unique ID for the 
  1879.             MAPP_SWAPPED property. Untouched if the page isn't
  1880.             swapped. The tag data points to a long word which will
  1881.             be filled in for swapped out pages.
  1882.         
  1883.         MAPTAG_USERDATA     -   read the unique cookie for 
  1884.             INVALID pages, fill in the long word pointed to by
  1885.             the tag data field.
  1886.  
  1887.         MAPTAG_DESCRIPTOR   -   fill in the location of the
  1888.             indirect descriptor which is used to perform the
  1889.             mapping. Only used if MAPP_INDIRECT is used.
  1890.  
  1891.         MAPTAG_SHAREMASK    -    in case of MAPP_SHARED pages,
  1892.             fill in the properties that are carried over from the
  1893.             parent to the child.
  1894.  
  1895.     RESULTS
  1896.     Returns a binary flags field for the attributes to define. See
  1897.     SetProperties() for details. Remember that MAPP_USED or 
  1898.     MAPP_MODIFIED reflect the bits on the abstraction layer, not the
  1899.     true hardware bits. You MUST call GetPageProperties() to read
  1900.     them, and hence *MUST* use MAPP_SINGLEPAGE pages.
  1901.  
  1902.     NOTES
  1903.     The page size can be read with GetPageSize(). Check the return  
  1904.     code of this call!
  1905.  
  1906.     The flags returned are valid for the given context, a different
  1907.     context may return a different flag setting and even a different
  1908.     physical locations.
  1909.  
  1910.     WARNING: The flags returned DO NOT reflect the hardware flags
  1911.     in the MMU table for the context. They DO reflect the settings
  1912.     installed with SetProperties() on the abstraction layer of the
  1913.     MMU tables.
  1914.  
  1915.     The hardware table might differ for the following reasons:
  1916.  
  1917.         - SetProperties() was called, but the changes haven't been
  1918.           made active with RebuildTree() yet.
  1919.         - A program modified the hardware layer directly using
  1920.           SetPageProperties().
  1921.         - DMA is currently active and the page in question has 
  1922.           therefore been marked as non-cacheable temporarely.
  1923.  
  1924.     Additionally, the library might have adjusted the abstraction
  1925.     layer itself by allocating non-cacheabe memory for its
  1926.     MMU tables.
  1927.  
  1928.     This routine is *NOT* safe to be called from within interrupts.
  1929.  
  1930.     BUGS
  1931.  
  1932.     SEE ALSO
  1933.     SetProperties(), AddContextHook(), GetMappingProperties(),
  1934.     GetPageSize(), GetPageProperties(), RebuildTree()
  1935.  
  1936. mmu.library/GetPageProperties         mmu.library/GetPageProperties
  1937.  
  1938.     
  1939.     NAME
  1940.     GetPropertiesA - read memory attributes from the hardware level
  1941.     for a given logical page. 
  1942.  
  1943.     SYNOPSIS
  1944.  
  1945.     flags = GetPagePropertiesA( context, lower, tags);
  1946.     d0                  a0       a1    a2
  1947.  
  1948.     ULONG GetPagePropertiesA( struct MMUContext *, void *, 
  1949.  
  1950.                 struct TagItem *);
  1951.  
  1952.  
  1953.     result = GetPageProperties( context, lower, tag1, ...);
  1954.  
  1955.     ULONG GetPageProperties( struct MMUContext *, void *, Tag tag1, ...);
  1956.  
  1957.     FUNCTION
  1958.     This call reads the page properties of a certain address in
  1959.     memory directly from the hardware. It is the counterpart
  1960.     of SetPageProperties().
  1961.  
  1962.     INPUTS
  1963.     context - a handle to the context to investigate or NULL for the
  1964.         active context. The library might use the MMU hardware directly
  1965.         if NULL is passed in, this call might be faster therefore.
  1966.  
  1967.     lower   - the logical address of the page to investigate. The
  1968.         size of the page depends on the hardware and is selected by
  1969.         the MMU library. The number of bytes in a page is returned
  1970.         by GetPageSize().
  1971.  
  1972.     tags    - additional tags. See GetProperties() for details.
  1973.  
  1974.  
  1975.     RESULTS
  1976.     Returns a binary flags field of the attributes found. See
  1977.     SetProperties() for details.
  1978.  
  1979.     NOTES
  1980.     The page size can be read with GetPageSize(). 
  1981.  
  1982.     The flags returned are valid for the given context, a different
  1983.     context may return a different flag setting and even a different
  1984.     physical location.
  1985.  
  1986.     WARNING: The flags returned reflect the NOT the hardware flags
  1987.     in the MMU table for the context except for the MODIFIED and USED
  1988.     properties, even though the hardware level is *almost* consistent
  1989.     with these flags. 
  1990.  
  1991.     The hardware table might differ slightly in the following 
  1992.     situations:
  1993.  
  1994.         - DMA is currently active and the page in question has 
  1995.           therefore been marked as non-cacheable temporarely.
  1996.           Therefore, the cache settings returned are what will be
  1997.           re-installed here when DMA is finished. The library
  1998.           will "fake" the flags you have installed for the page
  1999.           investigated.
  2000.         - The library will use invalid descriptors to implement
  2001.           supervisor only or swapped pages.
  2002.  
  2003.     However, even though the flags might differ from the hardware
  2004.     flags, you're always safe to re-install the properties with
  2005.     SetPageProperties, there's no need to keep track of pecularities
  2006.     like cache disabling for DMA pages. The library does this for you.
  2007.  
  2008.     MAPP_MODIFIED and MAPP_USED are always read from the hardware
  2009.     directly.
  2010.  
  2011.     KEEP IN MIND that these two bits are only set and handled
  2012.     consistently for MAPP_SINGLE pages. You MUST NOT interpret
  2013.     them in all other cases, their values might get lost on a
  2014.     RebuildTree() call.
  2015.  
  2016.     This routine is safe to be called from within interrupts, most
  2017.     useful within exception handlers.
  2018.  
  2019.     MAPP_SHARED will not be returned here in the "obvious meaning".
  2020.     If a page is build with MAPP_SHARED enabled, GetPageProperties()
  2021.     will return the effective properties for this page which are build
  2022.     from combining the properties of the parent context, filtered by
  2023.     the MAPTAG_SHAREMASK of the page, or'ed by the remaining properties.
  2024.  
  2025.     BUGS
  2026.     MAPP_SHARED is never returned as property of the page. Rather,
  2027.     the effective properties that have been constructed out of the
  2028.     parent context and the share mask is returned here.
  2029.  
  2030.     SEE ALSO
  2031.         GetProperties(), AddContextHook(), 
  2032.         GetPageSize(), SetPageProperties(), RebuildTree()
  2033.  
  2034. mmu.library/AllocAligned                   mmu.library/AllocAligned
  2035.  
  2036.     NAME
  2037.     AllocAligned    -   allocate memory aligned to a memory border.
  2038.  
  2039.     SYNOPSIS
  2040.     mem = AllocAligned( bytesize, reqments, align );
  2041.     d0            d0     d1    a0
  2042.  
  2043.     void * AllocAligned( ULONG, ULONG, ULONG);
  2044.  
  2045.     FUNCTION
  2046.     Allocate memory aligned to certain boundaries.
  2047.  
  2048.     INPUTS
  2049.     bytesize - the size of the memory to allocate. 
  2050.  
  2051.     reqments -  exec style memory attributes
  2052.  
  2053.     align   -   the alignment restrictions of the page.
  2054.             MUST be a power of two.
  2055.  
  2056.     RETURNS
  2057.     a pointer to the allocated memory, aligned to the given border or
  2058.     NULL if no free physical memory could be found.
  2059.  
  2060.     NOTES
  2061.     Examples of how to use the "align" parameter:
  2062.  
  2063.     mem = AllocAligned(123,MEMF_PUBLIC|MEMF_CLEAR,1024);
  2064.  
  2065.     will allocate 123 bytes starting at a 1024 byte border, i.e. 
  2066.     the address returned will be divisible by 1024. The call will 
  2067.     clear the 123 bytes, NOT MORE.
  2068.  
  2069.     This is a service routine for the memory.library and shouldn't be
  2070.     used for all-day purposes.
  2071.  
  2072.     A DOS process will have its pr_Result2 field set to
  2073.     ERROR_NO_FREE_STORE if the memory allocation fails.
  2074.  
  2075.     The mmu.library calls this function by using its LVO library entry,
  2076.     so it can be patched to a smarter implementation if desired.
  2077.  
  2078.     BUGS
  2079.  
  2080.     SEE ALSO
  2081.     GetPageSize(), exec/memory.h
  2082.  
  2083. mmu.library/LockMMUContext             mmu.library/LockMMUContext
  2084.  
  2085.     NAME
  2086.     LockMMUContext      -   lock a MMU context
  2087.  
  2088.     SYNOPSIS
  2089.     LockMMUContext( context );
  2090.               a0
  2091.  
  2092.     void LockMMUContext( struct MMUContext * );
  2093.  
  2094.     FUNCTION
  2095.     Lock the software abstraction layer of the MMU table against
  2096.     modifications from other tasks.
  2097.  
  2098.     INPUTS
  2099.     A handle to a MMUContext or NULL for the active context.
  2100.  
  2101.     RETURNS
  2102.  
  2103.     NOTES
  2104.     This mechanism DOES NOT avoid changes of the MMU table on a lower
  2105.     level by SetPageProperties(), only SetProperties() from other
  2106.     tasks will be locked.
  2107.     Hence, it locks the abstraction layer, but not the hardware
  2108.     level.
  2109.  
  2110.     DO NOT lock more than one context at once, unless you locked
  2111.     also the context list with LockContextList(). Not following 
  2112.     this rule might cause deadlocks.
  2113.  
  2114.     This call became more complex due to page sharing now. Locking
  2115.     a context involves a shared lock on the parent and exclusive
  2116.     locks on the children as well. This requires special care in
  2117.     case you want to lock a parent and a child context simul-
  2118.     taneously: Due to the way how exec shared semaphores work, you 
  2119.     must lock the parent context first, and then lock the child.
  2120.     The other order will cause a deadlock.
  2121.  
  2122.     BUGS
  2123.  
  2124.     SEE ALSO
  2125.     UnlockMMUContext(), SetPageProperties(), SetProperties(),
  2126.     LockContextList().
  2127.  
  2128. mmu.library/UnlockMMUContext           mmu.library/UnlockMMUContext
  2129.  
  2130.     NAME
  2131.     UnlockMMUContext    -   release a MMU context
  2132.  
  2133.     SYNOPSIS
  2134.     UnlockMMUContext( context );
  2135.                 a0
  2136.  
  2137.     void UnlockMMUContext( struct MMUContext * );
  2138.  
  2139.     FUNCTION
  2140.     Release the software abstraction layer of the MMU table, allow
  2141.     modifications from other tasks.
  2142.  
  2143.     INPUTS
  2144.     A handle to a MMUContext or NULL for the active context.
  2145.  
  2146.     RETURNS
  2147.  
  2148.     NOTES
  2149.     This mechanism DOES NOT avoid changes of the MMU table on a lower
  2150.     level by SetPageProperties(), only SetProperties() from other
  2151.     tasks will be locked.
  2152.     Hence, it locks the abstraction layer, but not the hardware
  2153.     level.
  2154.  
  2155.     BUGS
  2156.  
  2157.     SEE ALSO
  2158.     LockMMUContext(), SetPageProperties(), SetProperties(),
  2159.     AttemptLockMMUContext()
  2160.  
  2161. mmu.library/AttemptLockMMUContext      mmu.library/AttemptLockMMUContext
  2162.  
  2163.     NAME
  2164.     AttemptLockMMUContext       -   attempt to lock a MMU context
  2165.  
  2166.     SYNOPSIS
  2167.     ok = AttemptLockMMUContext( context );
  2168.                       a0
  2169.  
  2170.     struct MMUContext * AttemptLockMMUContext( struct MMUContext * );
  2171.  
  2172.     FUNCTION
  2173.     Grants non-blocking access to a MMU context.
  2174.     Attempts to lock the software abstraction layer of the MMU 
  2175.     table against modifications from other tasks. 
  2176.  
  2177.     INPUTS
  2178.     A handle to a MMUContext or NULL for the active context.
  2179.  
  2180.     RETURNS
  2181.     A context pointer in case of success - the context is then locked for
  2182.     you and this lock must be released with UnlockMMUContext().
  2183.     NULL in case any other task holds a lock.
  2184.  
  2185.     NOTES
  2186.     This mechanism DOES NOT avoid changes of the MMU table on a lower
  2187.     level by SetPageProperties(), only SetProperties() from other
  2188.     tasks will be blocked.
  2189.     Hence, it locks the abstraction layer, but not the hardware
  2190.     level.
  2191.  
  2192.     DO NOT lock more than one context at once, unless you locked
  2193.     also the context list with LockContextList(). Not following 
  2194.     this rule might cause deadlocks.
  2195.  
  2196.     This call became more complex due to page sharing now. Locking
  2197.     a context involves a shared lock on the parent and exclusive
  2198.     locks on the children as well. This requires special care in
  2199.     case you want to lock a parent and a child context simul-
  2200.     taneously: Due to the way how exec shared semaphores work, you 
  2201.     must lock the parent context first, and then lock the child.
  2202.     The other order will cause a deadlock.
  2203.  
  2204.     BUGS
  2205.     In pre-V39 machines, this call does not lock the context again
  2206.     in case you already hold a lock. This is a bug of the pre-V39
  2207.     AttemptSemaphore(), read the exec autodocs for a workaround.
  2208.  
  2209.     SEE ALSO
  2210.     UnlockMMUContext(), SetPageProperties(), SetProperties(),
  2211.     LockContextList(), AttemptSemaphore()
  2212.  
  2213. mmu.library/LockContextList            mmu.library/LockContextList
  2214.  
  2215.     NAME
  2216.     LockContextList     -   arbitrate a master lock.
  2217.  
  2218.     SYNOPSIS
  2219.     LockContextList( );
  2220.  
  2221.     void LockContextList( void );
  2222.  
  2223.     FUNCTION
  2224.     Arbitrates a master lock that allows locking more than one context
  2225.     at once to avoid deadlocks.
  2226.  
  2227.     INPUTS
  2228.  
  2229.     RETURNS
  2230.  
  2231.     NOTES
  2232.     This lock grants access for locking more than one context at once,
  2233.     to avoid deadlocks. I.e. in case you need to lock more than one
  2234.     context at a time, get this lock FIRST, then lock the contexts
  2235.     in any order you prefer.
  2236.  
  2237.     This call DOES NOT avoid modification of the context list or 
  2238.     individual contexts at all, i.e. other tasks are still able
  2239.     to create and to dispose contexts. To avoid this, you must lock
  2240.     the contexts afterwards.
  2241.  
  2242.     When you're done with the contexts, unlock the contexts first,
  2243.     THEN release this lock with UnlockContextList(). NOTE THE ORDER!
  2244.     
  2245.     BUGS
  2246.  
  2247.     SEE ALSO
  2248.     UnlockContextList(), LockMMUContext(), AttemptLockContextList()
  2249.  
  2250. mmu.library/UnlockContextList          mmu.library/UnlockContextList
  2251.  
  2252.     NAME
  2253.     UnlockContextList   -   release the master context lock
  2254.  
  2255.     SYNOPSIS
  2256.     UnlockContextList( );
  2257.  
  2258.     void UnlockContextList( void );
  2259.  
  2260.     FUNCTION
  2261.     Releases the master lock that allows locking more than one context
  2262.     at once to avoid deadlocks.
  2263.  
  2264.     INPUTS
  2265.  
  2266.     RETURNS
  2267.  
  2268.     NOTES
  2269.     This lock grants access for locking more than one context at once,
  2270.     to avoid deadlocks. I.e. in case you need to lock more than one
  2271.     context at a time, get this lock FIRST, then lock the contexts
  2272.     in any order you prefer.
  2273.  
  2274.     This call DOES NOT avoid modification of the context list or 
  2275.     individual contexts at all, i.e. other tasks are still able
  2276.     to create and to dispose contexts. To avoid this, you must lock
  2277.     the contexts afterwards.
  2278.  
  2279.     When you're done with the contexts, unlock the contexts first,
  2280.     THEN release this lock with UnlockContextList(). NOTE THE ORDER!
  2281.  
  2282.     BUGS
  2283.  
  2284.     SEE ALSO
  2285.     LockContextList(), LockMMUContext(), AttemptLockContextList()
  2286.  
  2287. mmu.library/AttemptLockContextList     mmu.library/AttemptLockContextList
  2288.  
  2289.     NAME
  2290.     AttemptLockContextList      -   attempt to arbitrate the master lock.
  2291.  
  2292.     SYNOPSIS
  2293.     ok = AttemptLockContextList( );
  2294.  
  2295.     LONG AttemptLockContextList( void );
  2296.  
  2297.     FUNCTION
  2298.     Attempts granting the context master lock in a non-blocking
  2299.     fashion. 
  2300.  
  2301.     INPUTS
  2302.  
  2303.     RETURNS
  2304.     TRUE in case the master lock could be arbitrated. You have then to
  2305.     release it with UnlockContextList().
  2306.     FALSE in case it is already locked and access could not be granted.
  2307.  
  2308.     NOTES
  2309.     This lock grants access for locking more than one context at once,
  2310.     to avoid deadlocks. I.e. in case you need to lock more than one
  2311.     context at a time, get this lock FIRST, then lock the contexts
  2312.     in any order you prefer.
  2313.  
  2314.     This call DOES NOT avoid modification of the context list or 
  2315.     individual contexts at all, i.e. other tasks are still able
  2316.     to create and to dispose contexts. To avoid this, you must lock
  2317.     the contexts afterwards.
  2318.  
  2319.     When you're done with the contexts, unlock the contexts first,
  2320.     THEN release this lock with UnlockContextList(). NOTE THE ORDER!
  2321.  
  2322.     BUGS
  2323.     In pre-V39 machines, this call does not lock the context again
  2324.     in case you already hold a lock. This is a bug of the pre-V39
  2325.     AttemptSemaphore(), read the exec autodocs for a workaround.
  2326.  
  2327.     SEE ALSO
  2328.     UnlockContextList(), LockMMUContext(), LockContextList(),
  2329.     AttemptLockSemaphore()
  2330.     
  2331. mmu.library/AllocLineVec               mmu.library/AllocLineVec
  2332.  
  2333.     NAME
  2334.     AllocLineVec    -   allocate cache line aligned, keep size
  2335.  
  2336.     SYNOPSIS
  2337.     AllocLineVec ( bytesize , attributes );
  2338.               d0          d1
  2339.  
  2340.     void * AllocLineVec ( ULONG, ULONG );
  2341.  
  2342.     FUNCTION
  2343.     Allocates memory like AllocVec(), but the memory is guaranteed
  2344.     to be aligned to cache lines of the processors in the system,
  2345.     even though the pointer returned IS NOT.
  2346.     Minimal guaranteed alignment is currently 32 bytes, i.e. a 
  2347.     PPC cache line. Future hardware may require stricter alignments.
  2348.  
  2349.     AllocLineVec'd memory is released with FreeVec() from the
  2350.     exec.library.
  2351.  
  2352.     INPUTS
  2353.     bytesize    -   the size of the memory block in bytes.
  2354.     attributes  -   memory attributes, see exec.library/AllocMem.
  2355.  
  2356.     RETURNS
  2357.     a pointer to the memory allocated or NULL on failure.
  2358.  
  2359.     A DOS process will have its pr_Result2 field set to
  2360.     ERROR_NO_FREE_STORE if the memory allocation fails.
  2361.  
  2362.     NOTES
  2363.     BIG WARNING: The pointer returned IS NEVER cache line aligned
  2364.     itself, but the complete memory block toghether with the
  2365.     vector size is kept in a cache line, regardless of the size
  2366.     passed in. Due to alignment restrictions, the routine might
  2367.     allocate a larger memory block than requested. It is however
  2368.     guaranteed that AT LEAST the size requested is returned, and
  2369.     that a FreeVec() will, indeed, free all memory.
  2370.  
  2371.     If MEMF_CLEAR is requested, the memory is cleared on the
  2372.     MC68K side, but the "zeros written" might be still in the
  2373.     cache. Hence, it is a good idea to flush the cache if the
  2374.     memory is passed over to the PPC.
  2375.  
  2376.     However, the vector size itself is always "pushed" to 
  2377.     memory, it is therefore guaranteed to be properly written
  2378.     back to the memory.
  2379.  
  2380.     The memory allocated this way is released by FreeVec() of
  2381.     the exec.library.
  2382.  
  2383.     BUGS
  2384.  
  2385.     SEE ALSO
  2386.     exec.library/AllocVec(), exec.library/FreeVec(), AllocLineVec()
  2387.  
  2388. mmu.library/PhysicalPageLocation       mmu.library/PhysicalPageLocation
  2389.  
  2390.     NAME
  2391.     PhysicalPageLocation    -   translate logical address to physical
  2392.  
  2393.     SYNOPSIS
  2394.     addr = PhysicalPageLocation( context , addr );
  2395.     d0                a0      a1
  2396.  
  2397.     void * PhysicalPageLocation( struct MMUContext * , void * );
  2398.  
  2399.     FUNCTION
  2400.     This function finds the physical address for the logical address
  2401.     passed in by scanning the MMU hardware table. 
  2402.     If the physical address is not available, NULL is returned.
  2403.  
  2404.     INPUTS
  2405.     context - the context to enter or NULL for the current context.
  2406.     addr    - the logical address to be translated.
  2407.  
  2408.     RETURNS
  2409.     the physical address of the logical address passed in, or NULL
  2410.     in case the logical address is not swapped in or otherwise out of
  2411.     control of the library.
  2412.  
  2413.     NOTES
  2414.     This is the low-level function, consider using the high-level
  2415.     function PhysicalLocation() when possible.
  2416.     This call can be safely used within interrupts.
  2417.  
  2418.     BUGS
  2419.     The function will also return NULL in case the logical address
  2420.     is translated to the address 0L. However, 0L should never be 
  2421.     used as physical address anyhow.
  2422.  
  2423.     SEE ALSO
  2424.     GetPageProperties(), PhysicalLocation()
  2425. mmu.library/PhysicalLocation           mmu.library/PhysicalLocation
  2426.  
  2427.     NAME
  2428.     PhysicalLocation    -   translate logical address to physical
  2429.  
  2430.     SYNOPSIS
  2431.     props = PhysicalLocation( context, addrptr, lenptr );
  2432.     d0                d1       a0       a1
  2433.  
  2434.     ULONG PhysicalLocation( struct MMUContext * , void ** , ULONG * );
  2435.  
  2436.     FUNCTION
  2437.     This function finds the physical address for the logical address
  2438.     passed in by scanning the software abstraction layer.
  2439.     If the physical address is not available, NULL is returned.
  2440.  
  2441.     INPUTS
  2442.     context - the context to enter or NULL for the current context.
  2443.     addrptr - points to the logical address to be translated.
  2444.           The physical address is filled in here, or NULL in case
  2445.           the logical address passed in is not available.
  2446.     lenptr  - Points to the length of the address range to be trans-
  2447.           lated. The function returns the length of the largest 
  2448.           possible continuous memory range contained in the memory
  2449.           range passed in. Hence, this function may shorten the
  2450.           memory block for fragmentized memory models. It will
  2451.           be NULL in case the memory is not available.
  2452.  
  2453.     RETURNS
  2454.     the properties of the memory range.
  2455.  
  2456.     NOTES
  2457.     This is the high-level function, it is not callable from within
  2458.     interrupts.
  2459.  
  2460.     In case you've to operate on a range of physical memory, start
  2461.     the translation with this call, then compare the size returned
  2462.     with the size of the memory block passed in. Because this 
  2463.     function may shorten the memory size in case the physical 
  2464.     memory is fragmentated, you should be prepared that the size
  2465.     returned is smaller than what was passed in. In this case, operate
  2466.     on the memory region returned, then add the returned size to
  2467.     the original logical address and call this function again to
  2468.     get the physical location of the next chunk.
  2469.  
  2470.     BUGS
  2471.  
  2472.     SEE ALSO
  2473.     GetProperties(), PhysicalPageLocation()
  2474. mmu.library/DMAInitiate                mmu.library/DMAInitiate
  2475.  
  2476.     NAME
  2477.     DMAInitiate     -   start a DMA transport given a logical address.
  2478.  
  2479.     SYNOPSIS
  2480.     fine = DMAInitiate( context, addrptr, lenptr, write );
  2481.                  d1       a0     a1     d0
  2482.  
  2483.     BOOL DMAInitiate( struct MMUContext * , void ** , ULONG * , BOOL );
  2484.  
  2485.     FUNCTION
  2486.     This function finds the physical address for the logical address
  2487.     passed in by scanning a backup of the MMU translation tree.
  2488.     It ignores modifications made by the high-level and low-level
  2489.     functions unless RebuildTree() is called.
  2490.  
  2491.     INPUTS
  2492.     context - the context to enter or NULL for the current context.
  2493.           NOTE: This parameter is currently a dummy and should be
  2494.           set to NULL. The mmu.library will always use the public
  2495.           context for translation.
  2496.     addrptr - points to the logical address to be translated.
  2497.           The physical address is filled in here.
  2498.     lenptr  - Points to the length of the address range to be trans-
  2499.           lated. The function returns the length of the largest 
  2500.           possible continous memory range contained in the memory
  2501.           range passed in. Hence, this function may shorten the
  2502.           memory block for fragmentized memory models.
  2503.     write   - set this to TRUE for transports from a DMA device INTO
  2504.           the memory, i.e. device reads. Set this to FALSE for
  2505.           writes from memory to the device.
  2506.  
  2507.     RETURNS
  2508.     fine    - TRUE if the address and length passed in pointed to available
  2509.           memory. FALSE if the requested DMA transfer was invalid.
  2510.  
  2511.     The result code is new for V42, do not check it for V41 or below.
  2512.  
  2513.     NOTES
  2514.     The function checks whether the memory range passed in is available
  2515.     for DMA. It will guru in case it is not, i.e. the page is either
  2516.     swapped out, invalid, indirect, or write protected for
  2517.     DMA device reads. Writes (i.e. reads from the device to the memory)
  2518.     into ROM addresses are silently tolerated, and, hence, are 
  2519.     translations to and from blank dummy pages.
  2520.  
  2521.     This function is callable from within interrupts, but does only
  2522.     use a backup of the high-level table for its translation.
  2523.     Changes to the software abstraction level are not visible for
  2524.     this function unless RebuildTree() is called. Changes to the
  2525.     hardware level are not at all visible to this (and all other
  2526.     high-level) functions.
  2527.  
  2528.     In case you've to operate on a range of physical memory, start
  2529.     the translation with this call, then compare the size returned
  2530.     with the size of the memory block passed in. Because this 
  2531.     function may shorten the memory size in case the physical 
  2532.     memory is fragmentated, you should be prepared that the size
  2533.     returned is smaller than what was passed in. With the physical
  2534.     address returned, start the DMA and call DMATerminate() when
  2535.     done.
  2536.     In case the returned size is smaller than the block passed in,
  2537.     add the returned size to the original logical address and 
  2538.     call this function again to get the physical location of the 
  2539.     next chunk.
  2540.  
  2541.     EACH CALL TO DMAInitiate() must be matched by ONE AND PRECISELY
  2542.     ONE call to DMATerminate().
  2543.  
  2544.     Even though this function does not require locking the context, 
  2545.     I highly recommend doing so. It won't crash if you don't, but
  2546.     someone else could modify the MMU translation table in between.
  2547.     The library can deal with that, but the result of the DMA 
  2548.     operation might be different from what you expect.
  2549.  
  2550.     The pre-V42 releases did not return a result code but generated
  2551.     an alert in case illegal memory has been passed in. This changed
  2552.     for V42. DO NOT assume a meaningful result code for V41 or
  2553.     below.
  2554.  
  2555.     BUGS
  2556.     This function should really use the context passed in, but
  2557.     since most (if not all) DMA device drivers do not keep the 
  2558.     context of the task that actually initiated the transfer and
  2559.     hence would use the wrong context anyhow, DMA is currently limited
  2560.     to the public context, or at least to memory areas that are
  2561.     "shared" from the public context.
  2562.  
  2563.     SEE ALSO
  2564.     DMATerminate(), PhysicalPageLocation(), exec/CachePreDMA()
  2565. mmu.library/DMATerminate               mmu.library/DMATerminate
  2566.  
  2567.     NAME
  2568.     DMATerminate    -   end a DMA transfer initiated by DMAInitiate.
  2569.  
  2570.     SYNOPSIS
  2571.     DMATerminate( context );
  2572.             d1       
  2573.  
  2574.     void DMATerminate( struct MMUContext * );
  2575.  
  2576.     FUNCTION
  2577.     This function ends a DMA transfer initiated by DMAInitate. It
  2578.     releases the resources by the first call.
  2579.  
  2580.     INPUTS
  2581.     context - the context to enter or NULL for the current context.
  2582.           NOTE: This parameter is currently a dummy and should be
  2583.           set to NULL. The mmu.library will always use the public
  2584.           context for translation.
  2585.  
  2586.     RETURNS
  2587.  
  2588.     NOTES
  2589.     This function is callable from within interrupts, but does only
  2590.     use a backup of the high-level table for its translation.
  2591.     Changes to the software abstraction level are not visible for
  2592.     this function unless RebuildTree() is called. Changes to the
  2593.     hardware level are not at all visible to this (and all other
  2594.     high-level) functions.
  2595.  
  2596.     EACH CALL TO DMAInitiate() must be matched by ONE AND PRECISELY
  2597.     ONE call to DMATerminate().
  2598.  
  2599.     For details, check the DMAInitiate() function.
  2600.  
  2601.     BUGS
  2602.     This function should really use the context passed in, but
  2603.     since most (if not all) DMA device drivers do not keep the 
  2604.     context of the task that actually initiated the transfer and
  2605.     hence would use the wrong context anyhow, DMA is currently limited
  2606.     to the public context.
  2607.  
  2608.     SEE ALSO
  2609.     DMAInitiate(), PhysicalPageLocation(), exec/CachePostDMA()
  2610. mmu.library/GetMapping                 mmu.library/GetMapping
  2611.  
  2612.     NAME
  2613.     GetMapping  -   get access to the memory map of a MMUContext
  2614.  
  2615.     SYNOPSIS
  2616.     list = GetMapping( context );
  2617.     d0             a0
  2618.  
  2619.     struct MinList * GetMapping( struct MMUContext * );
  2620.  
  2621.     FUNCTION
  2622.     This function makes a copy of the MapNodes for the given context.
  2623.     The nodes in this list describe the memory map as seen from tasks
  2624.     attached to this context, sorted by logical addresses.
  2625.     The list must be released afterwards with ReleaseMapping().
  2626.  
  2627.     INPUTS
  2628.     context - the context or NULL for the current context.
  2629.  
  2630.     RETURNS
  2631.     a pointer to a struct MinList which contains the MapNodes for this
  2632.     context, sorted by logical addresses, or NULL in case of failure.
  2633.  
  2634.     NOTES
  2635.     The nodes are just a copy of the real nodes within the context.
  2636.     
  2637.     This function is most useful to make a backup of the context
  2638.     memory map before altering it. In case any of the modifications
  2639.     fail, you are able to undo all modifications completely with
  2640.     a call to SetPropertyList() - which can't fail. 
  2641.  
  2642.     To give an example:
  2643.  
  2644.     /* make a backup of the context how it looks now */
  2645.  
  2646.     LockMMUContext(ctx);
  2647.  
  2648.     if (list=GetMapping(ctx)) {
  2649.         fine=TRUE;
  2650.  
  2651.         /* Try to alter it, step by step. */
  2652.  
  2653.         if (!SetProperties(...)) 
  2654.         fine=FALSE;
  2655.  
  2656.         if (!SetProperties(...))
  2657.         fine=FALSE;
  2658.  
  2659.         /* etc, etc.... */
  2660.  
  2661.         /* Oops, we failed! Re-install the old setup. */
  2662.         if (!fine) 
  2663.         SetPropertyList(ctx,list);
  2664.     }
  2665.     
  2666.     ReleaseMapping(ctx,list);
  2667.     UnlockMMUContext(ctx);
  2668.     /* and so on... */
  2669.  
  2670.     Note that you've still to call ReleaseContextList(), even in
  2671.     case of failure when you've already re-installed backup property
  2672.     list.
  2673.  
  2674.     BUGS
  2675.  
  2676.     SEE ALSO
  2677.     ReleaseMapping(), SetPropertyList(), mmu/context.h
  2678. mmu.library/ReleaseMapping             mmu.library/ReleaseMapping
  2679.  
  2680.     NAME
  2681.     ReleaseMapping  -   get access to the memory map
  2682.  
  2683.     SYNOPSIS
  2684.     ReleaseMapping( context , list );
  2685.              a0    a1
  2686.  
  2687.     void ReleaseMapping( struct MMUContext * , struct MinList * );
  2688.  
  2689.     FUNCTION
  2690.     This function releases the list of MapNodes arbitrated by 
  2691.     GetMapping.
  2692.  
  2693.     INPUTS
  2694.     context - the context the nodes where taken from.
  2695.     list    - the backup property list to release.
  2696.  
  2697.     RETURNS
  2698.  
  2699.     NOTES
  2700.     This function *MUST* be called, even in case the property list
  2701.     was re-installed with SetPropertyList().
  2702.  
  2703.     BUGS
  2704.  
  2705.     SEE ALSO
  2706.     NewMapping(), GetMapping(), SetPropertyList()
  2707.  
  2708. mmu.library/NewMapping                 mmu.library/NewMapping
  2709.  
  2710.     NAME
  2711.     NewMapping      -   build a new memory map
  2712.  
  2713.     SYNOPSIS
  2714.     list = NewMapping ( );
  2715.     d0
  2716.  
  2717.     struct MinList * NewMapping ( void );
  2718.  
  2719.     FUNCTION
  2720.     Build and initialize a new memory map list. All addresses in this
  2721.     list will be marked as MAPP_BLANK.
  2722.  
  2723.     INPUTS
  2724.     nothing.
  2725.  
  2726.     RESULTS
  2727.     a MinList structure, initialized with MapNodes representing a
  2728.     completely blank memory layout or NULL on failure. You either need 
  2729.     to copy the layout from a context with CopyContextRegion(), or 
  2730.     define your own layout with calls to SetMappingProperties().
  2731.  
  2732.     NOTES
  2733.     Don't forget to release the list (and its contents) with 
  2734.     ReleaseMapping() when you're done.
  2735.  
  2736.     BUGS
  2737.  
  2738.     SEE ALSO
  2739.     CopyContextRegion(), SetMappingProperties(), ReleaseMapping(),
  2740.     GetMapping()
  2741.  
  2742. mmu.library/CopyMapping                mmu.library/CopyMapping
  2743.  
  2744.     NAME
  2745.     CopyMapping     -   transfer memory properties between lists
  2746.  
  2747.     SYNOPSIS
  2748.     fine = CopyMapping ( from , to , base , length , mask );
  2749.     d0              a0    a1    d0      d1      d2     
  2750.  
  2751.  
  2752.     BOOL CopyMapping ( struct MinList * , struct MinList * ,
  2753.  
  2754.                  ULONG , ULONG , ULONG );
  2755.  
  2756.     FUNCTION
  2757.     Copy the memory properties from one memory map to another, thru
  2758.     a mask.
  2759.  
  2760.     INPUTS
  2761.     from    -   the memory map which is (partially) to be transfered.
  2762.     to      -   the destination of the copy operation.
  2763.     base    -   base address. Memory properties will be copied starting
  2764.             at this address.
  2765.     length  -   length of the memory region in bytes whose properties
  2766.             shall be transfered.
  2767.     mask    -   a mask of property bits which are to be transfered. A
  2768.             zero bit in this mask indicates that the corresponding
  2769.             property in the destination will not be touched. For
  2770.             all the properties, check the SetProperties() function.
  2771.  
  2772.     RESULTS
  2773.     a boolean success/failure indicator. It is TRUE in case the 
  2774.     operation was performed, FALSE otherwise. The destination will
  2775.     not have been touched at all in this case.
  2776.  
  2777.     NOTES
  2778.     this call does not copy memory. It just copies memory attributes
  2779.     from one memory map to another.
  2780.  
  2781.     Check CopyContextRegion() to copy the properties from a context
  2782.     instead from a list.
  2783.  
  2784.     Since this call is not context based, the library will not be able
  2785.     to perform checks for correct page alignment, you have to do that
  2786.     yourself. Especially, note that SetPropertyList() - which attaches
  2787.     a memory map to a context - does not perform any check on this
  2788.     list either. Hence, *NOT* checking for page alignment here might
  2789.     result in an invalid context if you try to attach an incorrectly
  2790.     aligned list to a context later on. 
  2791.  
  2792.     BUGS
  2793.  
  2794.     SEE ALSO
  2795.     SetPropertyList(), ReleaseMapping(), DupMapping(), SetProperties(),
  2796.     CopyContextRegion()
  2797.  
  2798. mmu.library/DupMapping                 mmu.library/DupMapping
  2799.  
  2800.     NAME
  2801.     DupMapping      -   make a one-to-one copy of a memory map
  2802.  
  2803.     SYNOPSIS
  2804.     dup = DupMapping ( list );
  2805.     d0            a0
  2806.  
  2807.     struct MinList * DupMapping( struct MinList * );
  2808.  
  2809.     FUNCTION
  2810.     this call builds an identical copy of the memory map passed in.
  2811.  
  2812.     INPUTS
  2813.     list    -   the memory map to be copied.
  2814.  
  2815.     RESULTS
  2816.     another memory list, identical to the list passed in, or NULL on
  2817.     failure.
  2818.  
  2819.     NOTES
  2820.     Don't forget to release the memory list with ReleaseMapping()
  2821.     if you're done with it. You need to release both, the original as
  2822.     well as the duplicate.
  2823.     In case you want to make a copy of the memory map of a context,
  2824.     use GetMapping() instead.
  2825.  
  2826.     BUGS
  2827.  
  2828.     SEE ALSO
  2829.     GetMapping(), ReleaseMapping()
  2830.  
  2831. mmu.library/CopyContextRegion          mmu.library/CopyContextRegion
  2832.  
  2833.     NAME
  2834.     CopyContextRegion   -   transfer properties from a context to a list
  2835.  
  2836.     SYNOPSIS
  2837.     fine = CopyContextRegion ( ctx, list, base, length, mask );
  2838.     d0                a0   a1    d0    d1      d2
  2839.  
  2840.     BOOL CopyContextRegion ( struct MMUContext *, struct MinList *,
  2841.                  
  2842.                  ULONG, ULONG, ULONG );
  2843.  
  2844.     FUNCTION
  2845.     Copy the properties of a memory region defined by a context to 
  2846.     another memory map, thru a mask.
  2847.  
  2848.     INPUTS
  2849.     ctx     -   source context whose memory map shall be transfered.
  2850.     list    -   the destination memory map which is to be altered.
  2851.     base    -   base address of the memory region whose properties are
  2852.             to be copied.
  2853.     length  -   length of the memory region in bytes whose properties
  2854.             will be transfered.
  2855.     mask    -   a mask of property bits, see the SetProperties() 
  2856.             function for a detailed explanation. A zero bit in this
  2857.             mask means that the corresponding property in the 
  2858.             destination will be left alone and will remain unchanged.
  2859.  
  2860.     RESULTS
  2861.     a boolean success/failure indicator, TRUE for success. On failure,
  2862.     the destination memory map will not have been touched at all.
  2863.  
  2864.     NOTES
  2865.     This call does not copy memory at all, it just defines the memory
  2866.     properties of a given memory map from that of a given context.
  2867.  
  2868.     Check CopyMapping() to transport memory properties from one list
  2869.     to another.
  2870.  
  2871.     Since this call is not context based, the library will not be able
  2872.     to perform checks for correct page alignment, you have to do that
  2873.     yourself. Especially, note that SetPropertyList() - which attaches
  2874.     a memory map to a context - does not perform any check on this
  2875.     list either. Hence, *NOT* checking for page alignment here might
  2876.     result in an invalid context if you try to attach an incorrectly
  2877.     aligned list to a context later on. 
  2878.  
  2879.     BUGS
  2880.  
  2881.     SEE ALSO
  2882.     SetPropertyList(), ReleaseMapping(), SetProperties(),
  2883.     SetPropertiesMapping()
  2884.  
  2885. mmu.library/SetPropertiesMapping           mmu.library/SetPropertiesMapping
  2886.  
  2887.     NAME
  2888.     SetPropertiesMapping    -   transfer properties from a map list 
  2889.                     to a context
  2890.  
  2891.     SYNOPSIS
  2892.     fine = SetPropertiesMapping ( ctx, list, base, length, mask );
  2893.     d0                a0   a1    d0     d1      d2
  2894.  
  2895.     BOOL SetPropertiesMapping ( struct MMUContext *, struct MinList *,
  2896.                  
  2897.                  ULONG, ULONG, ULONG );
  2898.  
  2899.     FUNCTION
  2900.     Copy the properties of a memory map to a context, thru a mask.
  2901.     This is equivalent to SetProperties(), except that the source
  2902.     data is contained in a memory map instead given as function
  2903.     arguments. This function is reverse to CopyContextRegion().
  2904.  
  2905.     INPUTS
  2906.     ctx     -   destination context whose memory map shall be set.
  2907.     list    -   the source memory map, containing the data to be 
  2908.             transfered.
  2909.     base    -   base address of the memory region whose properties are
  2910.             to be copied.
  2911.     length  -   length of the memory region in bytes whose properties
  2912.             will be transfered.
  2913.     mask    -   a mask of property bits, see the SetProperties() 
  2914.             function for a detailed explanation. A zero bit in this
  2915.             mask means that the corresponding property in the 
  2916.             destination will be left alone and will remain unchanged.
  2917.  
  2918.     RESULTS
  2919.     a boolean success/failure indicator, TRUE for success. On failure,
  2920.     the destination context will not have been touched at all.
  2921.  
  2922.     NOTES
  2923.     This call does not copy memory at all, it just defines the memory
  2924.     properties of the context passed in.
  2925.  
  2926.     Check CopyMapping() to transport memory properties from one list
  2927.     to another, or CopyContextRegion() to transfer properties from a
  2928.     context to a list (the other direction).
  2929.  
  2930.     The library will not be able to perform checks for correct page 
  2931.     alignment, you have to do that yourself. 
  2932.     BUGS
  2933.  
  2934.     SEE ALSO
  2935.     SetPropertyList(), ReleaseMapping(), SetProperties(),
  2936.     CopyContextRegion()
  2937.  
  2938. mmu.library/SetMappingProperties      mmu.library/SetMappingProperties
  2939.  
  2940.     NAME
  2941.     SetMappingPropertiesA   -   set memory attributes in a memory map.
  2942.  
  2943.     SYNOPSIS
  2944.  
  2945.     result = SetMappingPropertiesA( list, flags, mask, lower, size, tags);
  2946.     d0                 a0     d1    d2    a1     d0    a2
  2947.  
  2948.     int SetMappingPropertiesA( struct MinList *, ULONG, ULONG, 
  2949.                    ULONG, ULONG, struct TagItem *);
  2950.  
  2951.  
  2952.     result = SetMappingProperties( list, flags, mask, 
  2953.                        lower, size, tag1, ...);
  2954.  
  2955.     int SetMappingProperties( struct MinList *, ULONG, ULONG, 
  2956.                   ULONG, ULONG, Tag tag1, ...);
  2957.  
  2958.     FUNCTION
  2959.     This call sets attributes of a certain memory range of a given
  2960.     memory map.
  2961.  
  2962.     INPUTS
  2963.     list    - a minlist structure keeping the memory map to be altered.
  2964.     flags   - a binary flags field for the attributes to define. Check
  2965.           SetProperties() for details about the defined bits.
  2966.     mask    - A bit mask of the attributes to be changed.
  2967.     lower   - The lower boundary of the logical address to be modified. 
  2968.     size    - Size of the region to be modified. 
  2969.     tags    - A tag array with additional data, identical to the
  2970.           tags defined for SetProperties().
  2971.  
  2972.     RESULTS
  2973.     Unlike SetProperties() or SetPageProperties(), this does not
  2974.     return a boolean value! The result code is 0 on failure, and
  2975.     different from zero on success, though. To be more precise, this
  2976.     routine will return "1" in case of success, and "2" in case the
  2977.     memory map was really altered and is now "dirty", hence upper
  2978.     software layers might require a "rebuild".
  2979.  
  2980.     NOTES
  2981.     This call really doesn't do anything to the MMU, it is just an
  2982.     administration call to modify a memory map - a handy data structure
  2983.     you might want to use for your own memory administration. Its
  2984.     context-based equivalent SetProperties() will, hence, adjust the
  2985.     memory map which is kept by a context, and SetPageProperties()
  2986.     will perform the same operation truely on the hardware.
  2987.  
  2988.     Since this call is not context based, the library will not be able
  2989.     to perform checks for correct page alignment, you have to do that
  2990.     yourself. Especially, note that SetPropertyList() - which attaches
  2991.     a memory map to a context - does not perform any check on this
  2992.     list either. Hence, *NOT* checking for page alignment here might
  2993.     result in an invalid context if you try to attach an incorrectly
  2994.     aligned list to a context later on. 
  2995.  
  2996.     BUGS
  2997.  
  2998.     SEE ALSO
  2999.     SetPropertyList(), ReleaseMapping(), SetProperties(),
  3000.     SetPageProperties(), GetMappingProperties()
  3001.  
  3002. mmu.library/GetMappingProperties      mmu.library/GetMappingProperties
  3003.  
  3004.     NAME
  3005.     GetMappingPropertiesA   - read memory attributes from a memory map.
  3006.  
  3007.     SYNOPSIS
  3008.  
  3009.     flags = GetMappingPropertiesA( list, lower, tags);
  3010.     d0                a0    a1     a2
  3011.  
  3012.     ULONG GetMappingPropertiesA( struct MinList *, ULONG, 
  3013.                      struct TagItem *);
  3014.  
  3015.     result = GetMappingProperties( list, lower, tag1, ...);
  3016.  
  3017.     ULONG GetMappingProperties( struct MinList *, ULONG, Tag tag1, ...);
  3018.  
  3019.     FUNCTION
  3020.     This call reads the page properties of a certain address in
  3021.     memory from a memory map. It is the counterpart of 
  3022.     SetMappingProperties() and the memory map analogue of 
  3023.     GetProperties().
  3024.  
  3025.     INPUTS
  3026.     list    -   a MinList holding the memory map, obtained from either
  3027.             GetMapping(), DupMapping() or NewMapping().
  3028.     lower   -   the logical address of the address to investigate. 
  3029.     tags    -   additional tags, identical to those defined for
  3030.             GetProperties(). Check the documentation of this
  3031.             function for details.
  3032.  
  3033.     RESULTS
  3034.     Returns a binary flags field for the attributes to define. See
  3035.     SetProperties() for details. 
  3036.  
  3037.     NOTES
  3038.     This call is the analogue of the GetProperties() call. It operates
  3039.     directly on memory maps, unlike the former which operates only on
  3040.     the memory map of a context. This function does not require page 
  3041.     alignment because the mmu.library does not have a context to check
  3042.     the alignment restrictions, but you should note that a memory map
  3043.     that is to be attached to a context with DefineMapping() *HAS* to
  3044.     be correctly aligned.
  3045.  
  3046.     This routine is *NOT* safe to be called from within interrupts.
  3047.  
  3048.     BUGS
  3049.  
  3050.     SEE ALSO
  3051.     SetMappingProperties(), SetProperties(), GetPageProperties(),
  3052.     GetProperties()
  3053.  
  3054. mmu.library/SetPropertyList            mmu.library/SetPropertyList
  3055.  
  3056.     NAME
  3057.     SetPropertyList     -   re-install a backup memory map
  3058.  
  3059.     SYNOPSIS
  3060.     SetPropertyList ( context, list );
  3061.                 a0      a1
  3062.  
  3063.     void SetPropertyList ( struct MMUContext * , struct MinList * );
  3064.  
  3065.     FUNCTION
  3066.     This call re-installes a property list, i.e. a complete memory
  3067.     map of a context, obtained from GetMapping() before.
  3068.     
  3069.     INPUTS
  3070.     context     -   the context the list should be installed in.
  3071.             This should be the same context the list was
  3072.             taken from.
  3073.     list    -   the property list to install. 
  3074.  
  3075.     This list *MUST* have been obtained with GetMapping() before.
  3076.  
  3077.     RESULTS
  3078.     Nothing. The big advantage of this call is that it cannot fail.
  3079.  
  3080.     NOTES
  3081.     The property list will become part of the context and is empty
  3082.     after this call. You can't re-use it for that reason. However,
  3083.     you still need to call ReleaseMapping() with the list pointer
  3084.     you've obtained before.
  3085.  
  3086.     For additional tips how this function should be used, see the
  3087.     GetMapping() function; especially, you can only un-do changes
  3088.     to the software abstraction level of a MMU-tree, and only as
  3089.     long as you haven't called RebuildTree() to translate these
  3090.     into hardware MMU tables. Trying to un-do these changes with
  3091.     SetPropertyList() will fail, and it will even fail if you call
  3092.     RebuildTree() afterwards. SetPropertyList() *does not* inform
  3093.     the software abstraction level about any changes, it is just a
  3094.     quick un-do operation. (For the experts: It even re-installs
  3095.     the "dirty" flags).
  3096.  
  3097.     BUGS
  3098.     
  3099.     SEE ALSO
  3100.     GetMapping(), ReleaseMapping(), RebuildTree()
  3101.  
  3102. mmu.library/GetMMUType                 mmu.library/GetMMUType
  3103.  
  3104.     NAME
  3105.     GetMMUType - return the type of the MMU available in the system.
  3106.  
  3107.     SYNOPSIS
  3108.     mmu = GetMMUType( );
  3109.             
  3110.  
  3111.     char GetMMUType( void );
  3112.  
  3113.     FUNCTION
  3114.     Returns an identifier for the MMU available in the system or
  3115.     NUL in case no MMU is installed.
  3116.  
  3117.     INPUTS
  3118.  
  3119.     RETURNS
  3120.     a character identifying the MMU type:
  3121.  
  3122.     MUTYPE_NONE        no working MMU detected.
  3123.     MUTYPE_68851        a 68020 system with an external 68851
  3124.                 MMU.
  3125.     MUTYPE_68030        a 68030 MMU.
  3126.     MUTYPE_68040        the internal 68040 MMU.
  3127.     MUTYPE_68060        the 68060 MMU.
  3128.  
  3129.     NOTES
  3130.     The mmu library is smart enough to detect EC processors without a
  3131.     working MMU, but the library does not detect multiple MMUs in the
  3132.     system. (How?)
  3133.  
  3134.     BUGS
  3135.  
  3136.     SEE ALSO
  3137.     mmu/mmubase.h
  3138. mmu.library/SuperContext               mmu.library/SuperContext
  3139.  
  3140.     NAME
  3141.     SuperContext - find the supervisor context for a given context.
  3142.  
  3143.     SYNOPSIS
  3144.     super = SuperContext( context );
  3145.     d0            a0              
  3146.  
  3147.     struct MMUContext * SuperContext( struct MMUContext * );
  3148.  
  3149.     FUNCTION
  3150.     Returns the context that manages the supervisor mode for the user
  3151.     mode context passed in.
  3152.  
  3153.     INPUTS
  3154.     A user mode context or NULL for the current context.
  3155.  
  3156.     RETURNS
  3157.     A pointer to the context managing the supervisor type accesses with-
  3158.     in the current context.
  3159.  
  3160.     NOTES
  3161.     All contexts build by CreateMMUContext are by default user mode
  3162.     contexts. The current version of the library manages one global
  3163.     supervisor tree, and optionally private supervisor trees for private
  3164.     contexts if you ask for one on context creation. 
  3165.     
  3166.     To find the public supervisor mode context, call DefaultContext() 
  3167.     first and pass in its return value to this function.
  3168.  
  3169.     BUGS
  3170.  
  3171.     SEE ALSO
  3172.     DefaultContext(), CreateMMUContext()
  3173.  
  3174. mmu.library/DefaultContext             mmu.library/DefaultContext
  3175.  
  3176.     NAME
  3177.     DefaultContext  -   get the global default context
  3178.  
  3179.     SYNOPSIS
  3180.     public = DefaultContext( );
  3181.     d0
  3182.  
  3183.     struct MMUContext * DefaultContext( void );
  3184.  
  3185.     FUNCTION
  3186.     Returns the global default user mode context which is used for
  3187.     tasks that are not explicitly attached to any other context.
  3188.  
  3189.     INPUTS
  3190.  
  3191.     RETURNS
  3192.     A pointer to the context managing the user mode accesses for
  3193.     "context less" tasks.
  3194.  
  3195.     NOTES
  3196.     A task is by default part of this default context unless you
  3197.     call EnterMMUContext() and attach it to a different context.
  3198.  
  3199.     Note that you might have to enter even the default context
  3200.     explicitly to be able to use certain features of the exception
  3201.     hook mechanism.
  3202.  
  3203.     BUGS
  3204.  
  3205.     SEE ALSO
  3206.     SuperContext()
  3207. mmu.library/WithoutMMU                 mmu.library/WithoutMMU
  3208.  
  3209.     NAME
  3210.     WithoutMMU - execute a short subroutine with the MMU disabled.
  3211.  
  3212.     SYNOPSIS
  3213.     result = WithoutMMU( userFunc );
  3214.     d0            a5
  3215.  
  3216.     ULONG WithoutMMU(void *);
  3217.  
  3218.     FUNCTION
  3219.     Executes a small assembly language routine pointed to in a5
  3220.     in supervisor mode, with all interrupts disabled, and the MMU
  3221.     disabled. All registers are preserved by this call.
  3222.     The function must end with an RTS instruction.
  3223.  
  3224.     INPUTS
  3225.     userFunc    -   A pointer to a *short* assembly language routine,
  3226.             ending with RTS. The function has full access to
  3227.             all registers.
  3228.  
  3229.     RETURNS
  3230.     whatever was left in register d0 by the called function.
  3231.  
  3232.     NOTES
  3233.     This is a low-level function. Remember that disabling the MMU
  3234.     might or might not be what you want, especially if memory is
  3235.     remapped.
  3236.  
  3237.     Note that this function works even without a MMU. It just calls the
  3238.     routine in a5 in this case.
  3239.  
  3240.     BUGS
  3241.     Big trouble if the supervisor stack is in remapped memory.
  3242.  
  3243.     SEE ALSO
  3244.     exec/Supervisor(), RunOldConfig()
  3245. mmu.library/RunOldConfig                   mmu.library/RunOldConfig
  3246.  
  3247.     NAME
  3248.     RunOldConfig - execute a short subroutine with the old MMU
  3249.     configuration.   (V42)
  3250.  
  3251.     SYNOPSIS
  3252.     result = RunOldConfig( userFunc );
  3253.     d0              a5
  3254.  
  3255.     ULONG RunOldConfig(void *);
  3256.  
  3257.     FUNCTION
  3258.     Executes a small assembly language routine pointed to in a5
  3259.     in supervisor mode, with all interrupts disabled, and the MMU
  3260.     configuration the library found when it was started. This could 
  3261.     or could not be a disabled MMU.
  3262.     The function must end with an RTS instruction.
  3263.  
  3264.     INPUTS
  3265.     userFunc    -   A pointer to a *short* assembly language routine,
  3266.             ending with RTS. The function has full access to
  3267.             all registers.
  3268.  
  3269.     RETURNS
  3270.     whatever was left in register d0 by the called function.
  3271.  
  3272.     NOTES
  3273.     This is a low-level function. Remember that reloading the MMU
  3274.     with the last MMU configuration might or might not be what 
  3275.     you want, especially if memory is remapped or the MMU tables of
  3276.     the old configuration has been released.
  3277.  
  3278.     Note that this function works even without a MMU. It just calls the
  3279.     routine in a5 in this case.
  3280.  
  3281.     BUGS
  3282.     Big trouble if the supervisor stack is in remapped memory.
  3283.  
  3284.     SEE ALSO
  3285.     exec/Supervisor(), WithoutMMU()
  3286. mmu.library/SetBusError                mmu.library/SetBusError
  3287.  
  3288.     NAME
  3289.     SetBusError - define the bus error handler.
  3290.  
  3291.     SYNOPSIS
  3292.     SetBusError ( newfuncptr , oldfuncptrptr );
  3293.     d0        a0          a1
  3294.  
  3295.  
  3296.     void SetBusError ( void (*)() , void (**)() );
  3297.  
  3298.     FUNCTION
  3299.     This defines the bus error handler which is called in case the
  3300.     MMU library exception handler was not able to handle the fault.
  3301.  
  3302.     This happens for true physical bus errors and errors initiated by
  3303.     the unsupported TAS, CAS and CAS2 instructions using "locked
  3304.     transfers" not supported by the amiga hardware.
  3305.  
  3306.     The default bus error handler is whatever the library finds in
  3307.     the autovectors of the CPU when starting up. It is usually the
  3308.     exec exception handler which presents the nice guru 80000002.
  3309.  
  3310.     INPUTS
  3311.     newfuncptr    - A pointer to the new bus error handler. It is
  3312.             called without any parameters in supervisor state, 
  3313.             with the exception stack frame on the stack.
  3314.     oldfuncptrptr - A pointer to a pointer filled in with the previously
  3315.             defined handler, or NULL.
  3316.  
  3317.     RETURNS
  3318.  
  3319.     NOTES
  3320.     The function pointer is guaranteed to be flushed to memory by
  3321.     the library, the function pointer pointer could be used, for
  3322.     example, to modify the destination of a JMP instruction.
  3323.  
  3324.     The bus error handler *MUST BE IMMEDIATELY* ready for run after
  3325.     this function has to be called.
  3326.  
  3327.     This is a low-level function. You do not want to call it.
  3328.  
  3329.     BUGS
  3330.  
  3331.     SEE ALSO
  3332.  
  3333. mmu.library/GetMMUContextData          mmu.library/GetMMUContextData
  3334.  
  3335.     NAME
  3336.     GetMMUContextData - read MMUContext specific data
  3337.  
  3338.     SYNOPSIS
  3339.     GetMMUContextData ( ctx , id );
  3340.     d0            a0    d0
  3341.  
  3342.     ULONG GetMMUContextData ( struct MMUContext * , ULONG );
  3343.  
  3344.     FUNCTION
  3345.     This function reads various parameters of the MMU context,
  3346.     indexed by an ID from mmu/mmutags.h. All legal tag items
  3347.     of CreateMMContext() are available, plus the following:
  3348.  
  3349.         MGXTAG_PAGESIZE     -       Return the page size in bytes
  3350.                     of the input context. Unlike
  3351.                     MCXTAG_PAGEBITS, this is *NOT*
  3352.                     an exponent. This is identical
  3353.                     to GetPageSize().
  3354.  
  3355.         MGXTAG_REMAPSIZE    -       Returns the alignment restriction
  3356.                     for remapped memory to be added to
  3357.                     the exec memory free list. This is
  3358.                     identical to RemapSize().
  3359.  
  3360.         MGXTAG_ROOT        -       Return the pointer to the root of
  3361.                     the MMU tree. You have to cast the
  3362.                     result to an ULONG *. 
  3363.                     Note that you DO NOT WANT to modify 
  3364.                     this tree directly.
  3365.  
  3366.         MGXTAG_CONFIG       -       Returns the pointer to a 
  3367.                     struct MMUConfig * specifying the
  3368.                     complete MMU configuration for 
  3369.                     this context. You usually DO NOT
  3370.                     NEED to touch this.
  3371.  
  3372.         MGXTAG_PARENT (V43)    -    Returns the pointer to the parent
  3373.                     context of a sharing context that
  3374.                     has been created by MCXTAG_SHARE.
  3375.                     Returns NULL otherwise.
  3376.  
  3377.     INPUTS
  3378.     ctx     -       A pointer to a struct MMUContext *.
  3379.  
  3380.     id      -       An ID specifying which data you want to read.
  3381.             NOTE THAT THIS IS NOT A TAG LIST, but just the
  3382.             tag item id from mmutags.h.
  3383.     RETURNS
  3384.     the data requested. You need to cast it to the correct type.
  3385.  
  3386.     NOTES
  3387.  
  3388.     BUGS
  3389.  
  3390.     SEE ALSO
  3391.     CreateMMUContext(), mmu/config.h
  3392.     
  3393. mmu.library/SetMMUContextData            mmu.library/SetMMUContextData
  3394.  
  3395.     NAME
  3396.     SetMMUContextData - define MMU context specifications on the fly
  3397.  
  3398.     SYNOPSIS
  3399.     SetMMUContextDataA ( ctx , tags );
  3400.                  a0    a1
  3401.  
  3402.     SetMMUContextData ( ctx , ... );
  3403.  
  3404.  
  3405.     void SetMMUContextDataA ( struct MMUContext * , struct TagItem * );
  3406.  
  3407.     void SetMMUContextData ( struct MMUContext * , Tag tag1 , ... );
  3408.  
  3409.     FUNCTION
  3410.     This function allows to adjust *some* of the MMUContext 
  3411.     specifications on the fly. The following tag items of the 
  3412.     CreateMMUContext() call are supported:
  3413.  
  3414.         MCXTAG_BLANKFILL    -       define the data to read from the
  3415.                     dummy "blank" pages. Note that
  3416.                     a *working* program should never
  3417.                     read this data.
  3418.  
  3419.         MCXTAG_EXECBASE     -       specify whether or not page 0 will
  3420.                     be threated specially and accesses
  3421.                     to the first Kbyte should be
  3422.                     emulated. If set to FALSE, the 
  3423.                     first page will be threated as all
  3424.                     other pages.
  3425.  
  3426.         MCXTAG_ZEROBASE     -       Specify a base address for where 
  3427.                     possibly emulated zero page accesses
  3428.                     have to be redirected to. This address
  3429.                     is usually ignored unless the zero-
  3430.                     page is invalidated and MCXTAG_EXEBASE
  3431.                     is TRUE. For the messy details, check
  3432.                     the CreateMMUContext() autodocs.
  3433.  
  3434.         MCXTAG_LOWMEMORYLIMIT -     Define the lower boundary of valid
  3435.                     memory, used to emulate access to the
  3436.                     zero page. Defaults to the lower 
  3437.                     boundary of chip memory. (V42)
  3438.  
  3439.     No other tag items are valid here.
  3440.  
  3441.     INPUTS
  3442.     ctx     -       A pointer to a struct MMUContext *.
  3443.  
  3444.     tags    -       A tag list containing the parameters to be
  3445.             adjusted.
  3446.     RETURNS
  3447.  
  3448.     NOTES
  3449.  
  3450.     BUGS
  3451.  
  3452.     SEE ALSO
  3453.     CreateMMUContext(), exec/memory.h
  3454.  
  3455. mmu.library/BuildIndirect              mmu.library/BuildIndirect
  3456.  
  3457.     NAME
  3458.     BuildIndirect       -   build a true hardware page descriptor.
  3459.  
  3460.     SYNOPSIS
  3461.     descr = BuildIndirect ( ctx , address , props );
  3462.     d0            a0      d0    d1
  3463.  
  3464.     ULONG   BuildIndirect ( struct MMUContext * , ULONG , ULONG );
  3465.  
  3466.     FUNCTION
  3467.     This function builds a true hardware page descriptor, to be used for
  3468.     the MAPP_INDIRECT property. 
  3469.  
  3470.     INPUTS
  3471.     ctx     -   the MMUContext handle in which this descriptor is to
  3472.             be used as the destination of a MAPP_INDIRECT descriptor.
  3473.  
  3474.     address -   in case this descriptor is "valid", this is the 
  3475.             PHYSICAL destination address, to be told to the MMU, to
  3476.             which accesses will be redirected to. Unlike 
  3477.             SetProperties(), there is *NO* MAPP_REMAPPED bit. In
  3478.             case you do not want remapping, set this to the logical
  3479.             address. DO NOT LEAVE THIS BLANK or accesses will be
  3480.             redirected to address 0 - which is most likely not want
  3481.             you want. Note that this address must be, as all other
  3482.             addresses the MMU cares about, page aligned!
  3483.             In case this descriptor is of invalid type, the address
  3484.             can be used for your purposes, but note that this MUST
  3485.             STILL be a number which is page aligned for the given
  3486.             context. It *MAY NOT* be arbitrary.
  3487.         
  3488.     props   -   Properties for the descriptor to be defined.
  3489.             NOTE THAT THIS IS A TRUE HARDWARE DESCRIPTOR! The
  3490.             library WILL NOT BE ABLE to help you out by emulating
  3491.             missing features of one MMU or another. Instead, it will
  3492.             just ignore them. This means for you, specifically, 
  3493.             that only a minor subset of the usual properties may be
  3494.             used safely here, and that parsing the hardware 
  3495.             properties later on with GetIndirect() might result in
  3496.             different properties than you intended because of
  3497.             missing features of the MMU in use. To be precise, the
  3498.             following properties *might* be available - meaning that
  3499.             all others ARE NOT!
  3500.  
  3501.         MAPP_WRITEPROTECTED  -  The page will be write protected. 
  3502.             Writes to this area will cause a segmentation fault.
  3503.  
  3504.         MAPP_USED         -   The "used" bit of the pages
  3505.             will be set. The CPU will set this bit automatically
  3506.             as soon as the pages are accessed.
  3507.  
  3508.         MAPP_MODIFIED         -   The "modified" bit of the pages
  3509.             will be set. The CPU will set this bit automatically
  3510.             as soon as a write is performed to the page in question.
  3511.             DO NOT SET THIS BIT TOGETHER WITH MAPP_WRITEPROTECTED
  3512.             OR WITHOUT MAPP_USED or the CPU might hang. 
  3513.  
  3514.         MAPP_INVALID         -   The page will be marked as 
  3515.             invalid. Accessing it will invoke the bus error hook.
  3516.             See below for how to mark this page as REMAIRABLE. Note
  3517.             that the MAPP_REPAIRABLE bit is *here* not available.
  3518.  
  3519.         MAPP_CACHEINHIBIT    -   The page will be marked as non-
  3520.             cacheable.
  3521.  
  3522.         MAPP_IMPRECISE         -   The page will be marked as 
  3523.             "imprecise exception". MAPP_CACHEINHIBIT is mandatory
  3524.             in this case or this flag does nothing. Only avail-
  3525.             able for the 060, ignored and read as zero 
  3526.             by all others.
  3527.  
  3528.         MAPP_NONSERIALIZED   -   The page will be marked as
  3529.             serialized. MAPP_CACHEINHIBIT is mandatory if this
  3530.             property is selected. Only available for the 040, 
  3531.             ignored and read as zero by all others.
  3532.  
  3533.         MAPP_COPYBACK         -   The page will be marked as
  3534.             "copyback" instead of "writethrough". Generally re-
  3535.             commended since this is faster for the '40 and '60.
  3536.             MAPP_CACHEINHIBIT *MUST* be disabled for this to work.
  3537.             Only available for the 040 and 060, ignored and read
  3538.             as zero by others.
  3539.  
  3540.         MAPP_USERPAGE0         -   Set user page attribute 0,
  3541.             only available for the 040 and 060, ignored and read
  3542.             as zero by all others.
  3543.             The status of this bit appears on special pins of the
  3544.             CPU and might be required by some hardware, so don't    
  3545.             play with this. 
  3546.  
  3547.         MAPP_USERPAGE1         -   Set user page attribute 1,
  3548.             see above for details.
  3549.  
  3550.         MAPP_GLOBAL         -   DIFFERENT TO SetProperties()
  3551.             and others! 
  3552.             Set the GLOBAL bit in the page descriptor, only avail-
  3553.             able for the 040 and 060, ignored and read as zero by
  3554.             all others. 
  3555.             Setting this bit means that certain specialized 
  3556.             instructions will not flush this descriptor from the
  3557.             cache (the ATC) of the MMU.
  3558.             The mmu.library writes only descriptors without this
  3559.             bit set and does not use these instructions. It will
  3560.             always flush descriptors independent of the G bit.
  3561.             There is little use of this bit.
  3562.  
  3563.     RESULTS
  3564.     a page descriptor for the current MMU in use, designed and to be
  3565.     used for as the destination of an MAPP_INDIRECT descriptor. NOT
  3566.     to be used as a true page descriptor, and NOT to be used as a 
  3567.     table descriptor.
  3568.     In case the library finds no MMU or the alignment restrictions 
  3569.     aren't satisfied, it will return BAD_DESCRIPTOR (0x03), it 
  3570.     WILL NOT return NULL as this is a "valid invalid" descriptor.
  3571.         
  3572.     NOTES
  3573.     Note specifically that MAPP_SUPERVISORONLY *IS NOT* supported. The
  3574.     mmu.library enforces a distinct user/supervisor model and as such
  3575.     you might want to install an invalid descriptor into the user table
  3576.     and a valid descriptor into the supervisor table to emulate this
  3577.     feature. True "supervisor only" descriptors are available for the
  3578.     040 and 060 anyways, but this "emulation" works for all MMUs.
  3579.  
  3580.     MAPP_REMAPPED is not supported either because you have to specify
  3581.     a physical destination address in all cases, even if no remapping
  3582.     has to be performed. Use the logical address as physical address in
  3583.     case remapping is not desired.
  3584.  
  3585.     MAPP_REPAIRABLE is not available because this flag is in fact an
  3586.     emulation provided by the library. However, you may make access 
  3587.     faults to this page repairable by setting the MAPP_REPAIRABLE bit
  3588.     for the MAPP_INDIRECT descriptor that POINTS to the descriptor 
  3589.     you're building by this call. This will be enough to inform the
  3590.     library about how to treat access faults.
  3591.     
  3592.     How to use this function:
  3593.  
  3594.     Allocate four bytes of memory, long-word aligned, or even 16 bytes 
  3595.     line (16 byte) aligned in case you want to read back the descriptor 
  3596.     later by GetIndirect() and calculate its TRUE PHYSICAL location with 
  3597.     PhysicalLocation(). Use the return code of this function to mask in
  3598.     your properties, DO NOT ASSUME fixed properties. Build a descriptor 
  3599.     with BuildIndirect() and install it into this memory by calling 
  3600.     SetIndirect(). *DO NOT* write it to the memory yourself! 
  3601.     Due to CPU caching effects, this must be done by the library. 
  3602.     Then build a MAPP_INDIRECT descriptor, and tell the library with the
  3603.     MAPTAG_DESCRIPTOR tag of SetProperties() to make it point to your
  3604.     memory. In case you want access faults on this to be repairable,
  3605.     set the MAPP_REPAIRABLE bit for this call. In case you want it write 
  3606.     protected but want to ignore write accesses, set MAPP_ROM, too. Then
  3607.     call RebuildTree() as usual. In case you want to exchange descriptors
  3608.     really fast - this is after all what indirect descriptors are 
  3609.     designed for - build all descriptors you require in a first step
  3610.     and keep them. A single call to SetIndirect() will exchange them
  3611.     VERY RAPIDLY which is ideal for certain applications. For details,
  3612.     study the example code in the MMU Manual.
  3613.     
  3614.     BUGS
  3615.     Much more must be said about this function. It is definitely an
  3616.     advanced feature, so don't play with this in case you don't know
  3617.     what it does.
  3618.  
  3619.     SEE ALSO
  3620.     SetIndirect(), SetIndirectArray(), GetIndirect()
  3621.  
  3622. mmu.library/SetIndirect                mmu.library/SetIndirect
  3623.  
  3624.     NAME
  3625.     SetIndirect     -   Write a page descritor to memory
  3626.  
  3627.     SYNOPSIS
  3628.     SetIndirect ( destination , logical , descriptor );
  3629.             a0          a1      d0
  3630.  
  3631.     void SetIndirect ( ULONG *, ULONG, ULONG );
  3632.  
  3633.     FUNCTION
  3634.     Write a page descriptor, used as the destination of one or
  3635.     several MAPP_INDIRECT descriptors, out to memory and make the MMU
  3636.     aware of the change.
  3637.  
  3638.     INPUTS
  3639.     destination     -   the memory location to which the descriptor
  3640.                 should be written to. This is the same address
  3641.                 specified by MAPTAD_DESCRIPTOR in the corresponding
  3642.                 SetProperties() call. NOTE THAT THIS IS A 
  3643.                 PHYSICAL, NOT A LOGICAL ADDRESS.
  3644.                 This must be long-word aligned, or even 16 bytes 
  3645.                 line-aligned (16 bytes aligned) in case you want 
  3646.                 to read the descriptor later with GetIndirect().
  3647.  
  3648.     logical         -   The logical address covered by this descriptor, 
  3649.                 i.e. the address of the page which this 
  3650.                 descriptor is managing. In case you installed
  3651.                 the same descriptor for several logical addresses,
  3652.                 specify -1L (this will be slower, though.)
  3653.  
  3654.     descriptor      -   The descriptor to install.
  3655.  
  3656.     RESULTS
  3657.     doesn't return a result.
  3658.  
  3659.     NOTES
  3660.     Do NOT try to install a descriptor yourself, even though this 
  3661.     *seems* to be more effective. Somewhat more must be done than just
  3662.     writing the descriptor to memory. This call ensures that the
  3663.     descriptor is really written out to memory, and really fetched by
  3664.     the MMU. Specifying -1L as logical address is possible and supported
  3665.     but *slightly* less efficient than giving the correct 
  3666.     logical address.
  3667.     This call DOES NOT ensure that all data in the page to be modified
  3668.     is really written out. Hence, if you change the cache mode, the
  3669.     protection status or the validity status of a page, you should call
  3670.     CacheClearU() or CacheClearE() before. This step is, however, not
  3671.     required in case you just changed the physical destination.
  3672.     The library keeps then care about the necessary cache operations
  3673.     itself.
  3674.  
  3675.     This call is *very* effective, there is little reason to try this
  3676.     yourself, not counting the portability problems.
  3677.  
  3678.     In case you want to install more than about four descriptors at once,
  3679.     you should consider using SetIndirectArray() which causes even less 
  3680.     overhead in this situation.
  3681.  
  3682.     BUGS
  3683.  
  3684.     SEE ALSO
  3685.     SetIndirectArray(), GetIndirect(), BuildIndirect()
  3686.  
  3687. mmu.library/SetIndirectArray           mmu.library/SetIndirectArray
  3688.  
  3689.     NAME
  3690.     SetIndirectArray    -   Write multiple page descritors to memory
  3691.  
  3692.     SYNOPSIS
  3693.     SetIndirectArray ( destination , descriptors , number );
  3694.                 a0      a1        d0
  3695.  
  3696.     void SetIndirectArray ( ULONG *, ULONG *, ULONG );
  3697.  
  3698.     FUNCTION
  3699.     Write a complete array of page descriptors at once, re-defining
  3700.     the mapping for more than one page, and make the MMU aware of the
  3701.     changes.
  3702.  
  3703.     INPUTS
  3704.     destination     -   an array in memory which keeps the true hardware
  3705.                 MMU descriptors. This address, and all subsequent
  3706.                 addresses must have been used in the corresponding
  3707.                 SetProperties() call to setup the descriptor.
  3708.                 NOTE THAT THIS IS A PHYSICAL ADDRESS. Note further
  3709.                 that it is up to you to ensure that the 
  3710.                 (obviously continuous) array of logical addresses
  3711.                 is not fragmentated into several physical memory
  3712.                 blocks. If this happens, you would have to call
  3713.                 this routine several times, once for each dis-
  3714.                 continuous block.
  3715.                 This must be long-word aligned, or even a multiple
  3716.                 of a 16 byte line-aligned array in case you want
  3717.                 to read the descriptor later with GetIndirect().
  3718.  
  3719.     descriptors     -   An array of pre-calculated descriptor values to be
  3720.                 filled in. This is a logical address. Effectively,
  3721.                 this call copies this array to its first argument.
  3722.  
  3723.     number          -   The number of the descriptors to be defined. Zero
  3724.                 is allowed here, and is a no-op.
  3725.  
  3726.     RESULTS
  3727.     doesn't return a result.
  3728.  
  3729.     NOTES
  3730.     Do NOT try to install descriptors yourself, even though this 
  3731.     *seems* to be more effective. Somewhat more must be done than just
  3732.     writing the descriptors to memory. This call ensures that the
  3733.     descriptors are really written out to memory, and really fetched by
  3734.     the MMU. Note that this call does not require the logical address
  3735.     of the page(s) which are about to be changed, quite different to
  3736.     SetIndirect(). It will be therefore slower than SetIndirect() if
  3737.     only very descriptors are to be written.
  3738.     This call DOES NOT ensure that all data in the page(s) to be modified
  3739.     is really written out. Hence, if you change the cache mode, the
  3740.     protection status or the validity status of a page, you should call
  3741.     CacheClearU() or CacheClearE() before. 
  3742.     This step is not required in case you just change the physical
  3743.     destination of the pages involved, the library is able to handle
  3744.     this transparently.
  3745.  
  3746.     This call is *very* effective, there is little reason to try this
  3747.     yourself, not counting the portability problems.
  3748.  
  3749.     If you install only one descriptor, SetIndirect() is more effective.
  3750.     Note further that this call does not require the logical address of
  3751.     the page(s) to be provided, it will flush the complete ATC of the
  3752.     MMU and is therefore slower if only a few pages or even a single page
  3753.     has to be modified. 
  3754.  
  3755.     BUGS
  3756.  
  3757.     SEE ALSO
  3758.     SetIndirect(), GetIndirect(), BuildIndirect()
  3759.  
  3760. mmu.library/GetIndirect                mmu.library/GetIndirect
  3761.  
  3762.     NAME
  3763.     GetIndirect     -   Read a hardware page descritor from memory
  3764.  
  3765.     SYNOPSIS
  3766.     GetIndirect ( ctx , adt , address );
  3767.               a0    a1      d0
  3768.  
  3769.     void GetIndirect ( struct MMUContext *, 
  3770.                struct AbstractDescriptor *, ULONG * );
  3771.  
  3772.     FUNCTION
  3773.     Reads a true hardware page descriptor, used as the destination 
  3774.     of one or several MAPP_INDIRECT descriptors, and places its data
  3775.     in the AbstractDescriptor structure.
  3776.  
  3777.     INPUTS
  3778.     ctx        -   the MMU context handle this page descriptor
  3779.                 belongs.
  3780.     adt        -   An abstract table descriptor, to be filled
  3781.                 out with the descriptor data.
  3782.     address         -   the address from where the descriptor is to 
  3783.                 be read. This is the same address which has been
  3784.                 passed as argument to the MAPTAG_DESCRIPTOR
  3785.                 tag of the SetProperties() call when building
  3786.                 the indirect descriptor.
  3787.                 All descriptors to be read by this function must
  3788.                 reside in a separate cache line, i.e. must be
  3789.                 part of a line (16 byte) aligned array which is a
  3790.                 multiple of 16 bytes long. In all other cases,
  3791.                 this call could return improper results due to
  3792.                 cache clashes.
  3793.     
  3794.     RESULTS
  3795.     no direct result code, but the AbstractDescriptor is filled
  3796.     in as follows:
  3797.  
  3798.     struct AbstractDescriptor {
  3799.         ULONG       atd_Pointer;
  3800.         ULONG       atd_Properties;
  3801.         UWORD       atd_LowerLimit;
  3802.         UWORD       atd_UpperLimit;
  3803.         UBYTE       atd_ThisType;
  3804.         UBYTE       atd_NextType;
  3805.         UWORD       atd_reserved;
  3806.     };
  3807.  
  3808.     atd_Pointer is either the physical address the accesses to the
  3809.     page(s) this descriptor is installed for are redirected to, or
  3810.     the user data if this descriptor is of invalid type. This is the
  3811.     same value that was passed in as "address" argument to the
  3812.     corresponding BuildIndirect() call.
  3813.  
  3814.     atd_Properties is the set of MMU properties read from the 
  3815.     descriptor. This NEED NOT to be identical to the properties setup
  3816.     by BuildIndirect(), for two reasons: First, the MMU sets the
  3817.     USED and MODIFIED attributes as soon as any access or a write
  3818.     access happens to the page(s) handled by the descriptor. Second,
  3819.     not all MMUs support all properties. Unavailable properties are
  3820.     ignored by BuildIndirect(), and read as zero by this function.
  3821.  
  3822.     All other fields are currently not documented and should not be
  3823.     read.
  3824.  
  3825.     NOTES
  3826.     Do NOT try to read a descriptor yourself, even though this 
  3827.     *seems* to be more effective. Somewhat more care must be kept for
  3828.     doing this. NOT following this rule might even lock up your
  3829.     machine!
  3830.  
  3831.     This call is *very* effective, there is little reason to try this
  3832.     yourself, not counting the portability problems.
  3833.  
  3834.     BUGS
  3835.  
  3836.     SEE ALSO
  3837.     SetIndirect(), BuildIndirect(), mmu/descriptor.h
  3838.